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

如何在Pandas中实现未来n天的滚动求和(无销售日期补0)

解决Pandas中基于日期范围的未来n天销量求和问题

我懂你这个痛点——用Pandas自带的rolling方法确实适配不了这种场景,毕竟它是按行索引的滑动窗口来计算,而你的数据里日期是分散的(比如6号之后直接是8号,中间缺了7号),没法直接用固定行数的窗口对应实际的日期范围。

咱们一步步来解决:

步骤1:把分散的日期列合并成统一的datetime类型

首先得把day、month、year三列合并成一个标准的日期列,这样才能方便计算日期差和范围筛选:

import pandas as pd

# 你的原始数据
data = {
    'day': [6, 8, 12],
    'month': ['04', '04', '04'],
    'year': [2018, 2018, 2018],
    'quantity': [10, 8, 8]
}
df = pd.DataFrame(data)

# 合并为datetime列
df['date'] = pd.to_datetime(df[['year', 'month', 'day']])

步骤2:自定义函数计算未来n天的销量总和

接下来我们用apply方法,对每一行的日期,筛选出当前日期之后、且在n天范围内的所有记录,把它们的quantity加起来,再加上当前行的quantity(也就是你示例里的逻辑:当前值+未来n天的对应值,无记录则加0):

# 设置n值,这里以n=2为例
n = 2

# 计算final_quantity列
df['final_quantity'] = df['date'].apply(
    lambda current_date: 
    # 当前行的quantity
    df.loc[df['date'] == current_date, 'quantity'].values[0] + 
    # 未来n天内的quantity之和(没有则自动为0)
    df[(df['date'] > current_date) & (df['date'] <= current_date + pd.Timedelta(days=n))]['quantity'].sum()
)

# 输出你要的结果格式
print(df[['day', 'month', 'year', 'quantity', 'final_quantity']])

运行这段代码后,输出结果和你示例的完全一致:

day month  year  quantity  final_quantity
0    6    04  2018        10              18
1    8    04  2018         8               8
2   12    04  2018         8               8

为什么rolling不适用?

简单说,rolling是按行的位置来滑动窗口,比如rolling(2)就是取当前行和下一行,但你的数据里日期不是连续的(6号到8号差了2天,但只隔了1行),窗口行数和实际日期范围完全不匹配,所以没法直接用它来实现“未来n天”的逻辑。

内容的提问来源于stack exchange,提问作者Alessandro Ceccarelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:25:09