我有一个这样的数据框:
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在这里Resampling dataframe in pandas as a checking operation解决了如何执行此操作的问题。解决方案在做:
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
。我不明白为什么。对于这种特殊情况,是否不是相同的操作resample
和asfreq
?我想念什么?先感谢您。 最佳答案
请记住,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
更适合于频率转换。