Pandas TimeSeries 重新采样产生 NaN

Posted

技术标签:

【中文标题】Pandas TimeSeries 重新采样产生 NaN【英文标题】:Pandas TimeSeries resample produces NaNs 【发布时间】:2016-01-26 15:56:57 【问题描述】:

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

我无法在此处发布任何示例数据,因为它是敏感信息,但我按如下方式创建和重新采样该系列:

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

【问题讨论】:

如果你上采样那么默认是引入NaN值,除了没有代表性的示例代码很难进一步评论 【参考方案1】:

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

【讨论】:

不同的填充方法有什么作用?关于它们的 pandas 文档相当有限。 ffilll 和 bfill 是不言自明的,但是 pad 呢? 我认为doc 解释得更好。相反,您可以使用 resample。【参考方案2】:

请注意,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()

【讨论】:

以上是关于Pandas TimeSeries 重新采样产生 NaN的主要内容,如果未能解决你的问题,请参考以下文章

用最少的观察次数对 Pandas 重新采样

pandas的resample重采样

pandas resample 重采样

当所有值都是 NaN 时,Pandas 重新采样以返回 NaN

Pandas 重新采样倒数的时间序列(或反向重新采样)

Pandas 重新采样开始日期