Pandas时间序列重采样产生NaN值

12

我正在重新采样Pandas时间序列。该时间序列由二进制值组成(它是一个分类变量),没有缺失值,但在重新采样后出现了NaN值。这是怎么可能的?

由于涉及敏感信息,我不能在此处发布任何示例数据,但我创建和重新采样系列的步骤如下:

series = pd.Series(data, ts)
series_rs = series.resample('60T', how='mean')

如果您进行上采样,则默认情况下会引入“NaN”值,此外,如果没有代表性的示例代码,很难进一步评论。 - EdChum
3个回答

15

上采样 将数据转换为一个固定的时间间隔,如果没有数据则将得到 NaN

您可以通过 fill_method='bfill' 向后填充缺失值,或者向前填充使用 fill_method='ffill' 或者 fill_method='pad'

import pandas as pd

ts = pd.date_range('1/1/2015', periods=10, freq='100T')
data = range(10)
series = pd.Series(data, ts)
print series
#2015-01-01 00:00:00    0
#2015-01-01 01:40:00    1
#2015-01-01 03:20:00    2
#2015-01-01 05:00:00    3
#2015-01-01 06:40:00    4
#2015-01-01 08:20:00    5
#2015-01-01 10:00:00    6
#2015-01-01 11:40:00    7
#2015-01-01 13:20:00    8
#2015-01-01 15:00:00    9
#Freq: 100T, dtype: int64
series_rs = series.resample('60T', how='mean')
print series_rs
#2015-01-01 00:00:00     0
#2015-01-01 01:00:00     1
#2015-01-01 02:00:00   NaN
#2015-01-01 03:00:00     2
#2015-01-01 04:00:00   NaN
#2015-01-01 05:00:00     3
#2015-01-01 06:00:00     4
#2015-01-01 07:00:00   NaN
#2015-01-01 08:00:00     5
#2015-01-01 09:00:00   NaN
#2015-01-01 10:00:00     6
#2015-01-01 11:00:00     7
#2015-01-01 12:00:00   NaN
#2015-01-01 13:00:00     8
#2015-01-01 14:00:00   NaN
#2015-01-01 15:00:00     9
#Freq: 60T, dtype: float64
series_rs = series.resample('60T', how='mean', fill_method='bfill')
print series_rs
#2015-01-01 00:00:00    0
#2015-01-01 01:00:00    1
#2015-01-01 02:00:00    2
#2015-01-01 03:00:00    2
#2015-01-01 04:00:00    3
#2015-01-01 05:00:00    3
#2015-01-01 06:00:00    4
#2015-01-01 07:00:00    5
#2015-01-01 08:00:00    5
#2015-01-01 09:00:00    6
#2015-01-01 10:00:00    6
#2015-01-01 11:00:00    7
#2015-01-01 12:00:00    8
#2015-01-01 13:00:00    8
#2015-01-01 14:00:00    9
#2015-01-01 15:00:00    9
#Freq: 60T, dtype: float64

1
不同的填充方法有什么作用呢?Pandas文档对它们的介绍相当有限。ffill和bfill是不言自明的,但pad是什么意思呢? - Peter Lenaers
我认为doc比我更好地解释了它。你可以使用resample而不是fillna。 - jezrael

5
请注意,fill_method现已弃用。现在resample()返回一个重新采样对象,您可以像对待groupby对象一样对其执行操作。
常见的降采样操作:
.mean()
.sum()
.agg()
.apply()

上采样操作:

.ffill()
.bfill()

请查看文档中的“新内容”消息。示例链接如下:https://pandas.pydata.org/pandas-docs/stable/whatsnew.html#whatsnew-0180-breaking-resample。因此,示例将变为:
series_rs = series.resample('60T').mean()

1

当对时间序列进行上采样时,在调用.resample()之后,您仍需要在所需的列上调用.interpolate()来填充那些NaN值。

df = df.resample('15min').mean()
df['my_column'] = df['my_column'].interpolate()

你能否扩展一下你的回答,通过编辑来包含更多细节,可能包括一个更完整的代码示例? - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接