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

Pandas按id分组计算两个90天周期销售总额差值的简化方法

实现方法

核心思路是不用创建多个临时DataFrame,通过条件聚合一次性计算两个窗口的求和结果,再做差值计算,代码更简洁高效。

前置准备

首先确保date列是datetime类型:

import pandas as pd

# 数据读取后先转换日期格式
df['date'] = pd.to_datetime(df['date'])

定义时间边界

根据你指定的当日日期(示例为2021-10-13),直接计算两个90天窗口的起止时间:

current_date = pd.to_datetime('2021-10-13')
# 窗口1:以当日为终点的近90天
end_1 = current_date
start_1 = end_1 - pd.DateOffset(days=90)
# 窗口2:以30天前为终点的近90天
end_2 = current_date - pd.DateOffset(days=30)
start_2 = end_2 - pd.DateOffset(days=90)

单步分组聚合计算

提前定义区间筛选掩码提升性能,直接在groupby中完成两个区间的求和计算,无需额外合并操作:

# 提前定义两个区间的筛选掩码,避免分组时重复计算
mask_recent = (df['date'] >= start_1) & (df['date'] <= end_1)
mask_30d_ago = (df['date'] >= start_2) & (df['date'] <= end_2)

result = df.groupby('id').agg(
    sum_recent=('value', lambda x: x[mask_recent.loc[x.index]].sum()),
    sum_30d_ago=('value', lambda x: x[mask_30d_ago.loc[x.index]].sum())
).assign(fluctuation=lambda x: x['sum_recent'] - x['sum_30d_ago']).reset_index()

最终得到的result就包含每个id的两个区间求和结果和最终波动值。

扩展场景(可选)

如果你需要对多个日期批量计算这个波动值,可以用pandas的时间滚动窗口功能:先按id和日期排序后设置时间索引,再用rolling('90D').sum()计算滚动90天总和,再偏移30天做差值即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:15:00