Python中计算日期移动求和时如何处理数据中缺失的日期?
缺失日期下的pandas滚动求和实现
方案1:直接使用时间窗口滚动(最优方案)
无需补全缺失日期,直接利用pandas rolling 原生支持时间偏移作为窗口的特性实现,代码简洁、性能更高,输出结果和你给出的示例完全匹配:
import pandas as pd df = pd.DataFrame({ 'date':['2021-01-01', '2021-01-02', '2021-01-04', '2021-01-05'], 'value':[1, 1, 1, 1] }) # 1. 将date列转为datetime类型,设置为索引 df['date'] = pd.to_datetime(df['date']) df = df.set_index('date') # 2. 计算2自然日滚动求和,窗口参数'1D'表示时间跨度为1天,即当前日+前1个自然日 df['2_day_cum_sum'] = df['value'].rolling('1D').sum().astype(int) # 可选:将date恢复为普通列 df = df.reset_index() print(df)
参数说明:rolling('1D') 会自动按自然日的时间差判断数据是否属于窗口,2021-01-04和2021-01-02的时间差超过1天,因此不会被计入同一个窗口,正好符合你需要的计算逻辑。
方案2:补全日期后计算(适合需要输出完整连续日期的场景)
如果业务需要输出所有连续日期的计算结果,或者使用的pandas版本不支持时间窗口,可以用你原本的思路实现:
import pandas as pd df = pd.DataFrame({ 'date':['2021-01-01', '2021-01-02', '2021-01-04', '2021-01-05'], 'value':[1, 1, 1, 1] }) df['date'] = pd.to_datetime(df['date']) # 1. 生成覆盖所有日期的连续序列 all_dates = pd.date_range(start=df['date'].min(), end=df['date'].max(), freq='D') # 2. 重索引补全缺失日期 df_full = df.set_index('date').reindex(all_dates).reset_index().rename(columns={'index':'date'}) # 3. 计算滚动求和 df_full['2_day_cum_sum'] = df_full['value'].rolling(2).sum() # 4. 过滤回原始存在的日期(不需要完整日期则保留df_full即可) df_result = df_full.dropna(subset=['value']).reset_index(drop=True) print(df_result)
分组场景适配
如果需要按维度(比如品类、地区)分组分别计算滚动和,新增groupby逻辑即可:
# 假设df包含group列作为分组维度 df['2_day_cum_sum'] = df.groupby('group', group_keys=False)\ .apply(lambda x: x.set_index('date')['value'].rolling('1D').sum())\ .reset_index(drop=True)
内容的提问来源于stack exchange,提问作者mf17
相关产品推荐
相关产品推荐

