在 Python 中使用 window 中的向前和向后填充进行 Groupby 和重新采样

Groupby and resample using forward and backward fill in window in Python

我想使用正向填充 ffill 和反向填充 bfill1min 的频率对数据列重新采样,同时按 id 列对 df 进行分组.

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 天内的 window 内重新采样来添加附加条件?所以最后 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'

所以我不应该为 groupby 对象应用 reindex,有没有办法解决它?

没有数据,我无法真正测试这个。因此,将其作为 suggestion/comment 放置以进行正确格式化。由于您希望使用 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')