0

我想以按列分组的频率使用前向填充ffill和后向填充对数据列进行重新采样。bfill1mindfid

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,有没有办法可以解决它?

4

1 回答 1

1

没有数据,我无法真正测试这一点。因此,将此作为正确格式的建议/评论。由于您希望使用 重新采样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')
                   
于 2021-03-15T03:20:26.783 回答