在pandas中重新采样和asfreq的行为不同

时间:2017-01-12 11:56:39

标签: python pandas resampling

我有一个这样的数据框:

                            A        B    value
2014-11-14 12:00:00      30.5    356.3      344
2014-11-15 00:00:00      30.5    356.3      347
2014-11-15 12:00:00      30.5    356.3      356
2014-11-16 00:00:00      30.5    356.3      349
...
2017-01-06 00:00:00      30.5    356.3      347

我想确保从开始到结束都没有丢失的时间(即索引从12到12小时没有更大的跳跃)。如果缺少日期,例如,如果缺少值,例如在2015-12-12 12:00:00我想添加如下行:

...
2015-12-12 00:00:00     30.5    356.3    323
2015-12-12 12:00:00     30.5    356.3    NaN  *<- add this*
2015-12-13 00:00:00     30.5    356.3    347

@ ted-petrou在is deprecated解决了如何解决这个问题的问题。解决方案正在做:

df1= df.asfreq('12H')
df1[['A','B']] = df1[['A','B']].fillna(method='ffill')

我的问题:我可以使用resample代替asfreq吗?做

df1= df.resample('12H')
df1[['A','B']] = df1[['A','B']].fillna(method='ffill')

我得到ValueError: cannot set items on DatetimeIndexResampler。我不明白为什么。对于这种特殊情况,操作resampleasfreq是否相同?我错过了什么?提前谢谢。

1 个答案:

答案 0 :(得分:1)

请注意,DF.resample()是一个基于时间的群组,必须在每个群组之后使用缩减方法。

所以简单地使用它只会初始化Resampler,就像调用DF.rolling()方法时一样。两者在这里表现相似:

df[['A', 'B']].resample('12H')
DatetimeIndexResampler [freq=<12 * Hours>, axis=0, closed=left, label=left, convention=start, base=0]

您需要指定一个聚合函数,以便它具有计算组的度量。

为了您的情况,请执行此操作:

1)在两列上使用.resample().ffill(),然后将其与第三列连接起来。当然,由于第3次没有重新采样,它们将被NaNs填充。

df[['A', 'B']].resample('12H').ffill().join(df['value'])

2)使用.resample().asfreq()作为aggfunc,与您的工作类似:

df1 = df.resample('12H').asfreq()
df1[['A','B']] = df1[['A','B']].fillna(method='ffill')

注意: 如果最终目标与汇总群组无关,那么使用.asfreq()可能比.resample更适合频率转换