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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:09:02