如何解决在 Python 中使用向前和向后填充窗口进行分组和重新采样
我想使用前向填充 ffill
和后向填充 bfill
以 1min
的频率重新采样数据列,同时按 df
列对 id
进行分组。
df
:
id timestamp data
1 1 2017-01-02 13:14:53.040 10.0
2 1 2017-01-02 16:04:43.240 11.0
...
4 2 2017-01-02 15:22:06.540 1.0
5 2 2017-01-03 13:55:34.240 2.0
...
我用过:
pd.DataFrame(df.set_index('timestamp').groupby('id',sort=True)['data'].resample('1min').ffill().bfill())
如何通过在过去 10 天后的窗口内重新采样来添加附加条件?所以最后一个 timestamp
读数是现在,第一个 timestamp
读数是 datetime.datetime.now() - pd.to_timedelta("10day")。目标是为每个 id
组提供相同数量的读数。
更新:
尝试过:
start = datetime.datetime.now() - pd.to_timedelta("10day")
end = datetime.datetime.now()
r = pd.to_datetime(pd.date_range(start=start,end=end,freq='1h'))
pd.DataFrame(df.reset_index().set_index('timestamp').groupby('id',sort=True).reindex(r)['data'].resample('1h').ffill().bfill())
并返回:
AttributeError: 'DataFrameGroupBy' object has no attribute 'reindex'
所以我不应该为 reindex
对象应用 groupby
,有没有办法解决它?
解决方法
没有数据,我无法真正对此进行测试。因此,将此作为正确格式化的建议/评论。由于您希望使用 bfill/ffill
重新采样,我认为 merge_asof
会起作用:
# common time window
r = pd.to_datetime(pd.date_range(start='2017-12-23',end='2017-01-02 23:00:00',freq='1h'))
# unique id
unique_ids = df['id'].unique()
# new time reference:
new_df = pd.DataFrame({'id': np.repeat(unique_ids,len(r)),'time': np.tile(r,len(unique_ids)),})
# merge_asof may complain about sorting key,then sort both df by time
# default of merge_asof is `direction='backward'`
# change to `direction='forward'` if you want to *floor* time
out = pd.merge_asof(new_df,df,on='time',by='id')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。