pandas扩展resample结束日期范围解决滑动窗口计算异常问题
问题根因
你当前代码返回False的核心原因是:resample重采样仅基于现有数据的最大日期(2018-01-07)生成时间序列,最终仅得到7条日度数据,滚动窗口默认要求窗口内有8条数据才会计算求和,因此无符合要求的窗口统计结果。
解决方案
在分组重采样前,先对每个id分组的时间范围向后扩展7天(覆盖8天窗口需要的最大外延长度),确保所有自然日维度的8天窗口都能被纳入计算,缺失日期的req_met值默认补0,不影响求和逻辑。同时给滚动窗口设置min_periods=7参数,允许边界窗口最少有7条有效数据时就执行计算。
修改后的可运行代码如下:
import pandas as pd ids = 1 req_met = ['TRUE', 'TRUE', 'TRUE', 'TRUE', 'TRUE', 'TRUE', 'TRUE'] date = ['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05', '2018-01-06', '2018-01-07'] df = pd.DataFrame({'id':ids, 'Date':date, 'req_met':req_met}) df['req_met'] = df['req_met'].replace({'TRUE':True, 'FALSE':False}) df['Date'] = pd.to_datetime(df.Date) # 对每个id分组扩展时间范围,结束日期向后延7天,覆盖所有可能的8天窗口 df = df.groupby('id', group_keys=False).apply( lambda x: x.set_index('Date').reindex( pd.date_range(start=x['Date'].min(), end=x['Date'].max() + pd.Timedelta(days=7), freq='D') ).reset_index(names='Date').fillna({'id':x['id'].iloc[0], 'req_met':0}) ) df['req_met'] = df['req_met'].astype(int) df['Month'] = df.Date.dt.strftime("%Y-%m") df_result = (df.groupby(['id','Month']) .rolling(8, min_periods=7)['req_met'].sum().ge(7) .groupby(['id','Month']) .max() .reset_index(name='req_met') ) print(df_result)
运行后输出结果:
id Month req_met 0 1 2018-01 True
内容的提问来源于stack exchange,提问作者Dr Wampa
相关产品推荐
相关产品推荐

