You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:06:03