Pandas TimeSeries 重采样产生 NaN
Pandas TimeSeries resample produces NaNs
我正在对 Pandas TimeSeries 进行重采样。时间序列由二进制值(它是一个分类变量)组成,没有缺失值,但在重新采样后出现 NaN。这怎么可能?
我无法在此处 post 任何示例数据,因为它是敏感信息,但我按如下方式创建并重新采样该系列:
series = pd.Series(data, ts)
series_rs = series.resample('60T', how='mean')
upsampling
转换为固定时间间隔,因此如果没有样本,您将得到 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
请注意 fill_method 现已弃用。 resample()
现在 returns 一个重采样对象,您可以在其上执行操作,就像 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()
对时间序列进行上采样时,在调用 .resample()
之后,您仍然需要在所需的列上调用 .interpolate()
以填充那些 NaN
。
df = df.resample('15min').mean()
df['my_column'] = df['my_column'].interpolate()
我正在对 Pandas TimeSeries 进行重采样。时间序列由二进制值(它是一个分类变量)组成,没有缺失值,但在重新采样后出现 NaN。这怎么可能?
我无法在此处 post 任何示例数据,因为它是敏感信息,但我按如下方式创建并重新采样该系列:
series = pd.Series(data, ts)
series_rs = series.resample('60T', how='mean')
upsampling
转换为固定时间间隔,因此如果没有样本,您将得到 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
请注意 fill_method 现已弃用。 resample()
现在 returns 一个重采样对象,您可以在其上执行操作,就像 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()
对时间序列进行上采样时,在调用 .resample()
之后,您仍然需要在所需的列上调用 .interpolate()
以填充那些 NaN
。
df = df.resample('15min').mean()
df['my_column'] = df['my_column'].interpolate()