如何在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
相关产品推荐
相关产品推荐

