You need to enable JavaScript to run this app. 如何基于多列多条件求和计算各物料过去30天累计发货量
优惠活动
大模型
产品
解决方案
定价
更多

如何基于多列多条件求和计算各物料过去30天累计发货量

实现方案(10万行数据秒级出结果,避免逐行遍历的性能问题)

你需要的是按物料分组的滑动时间窗口求和,直接用pandas内置的滚动时间窗口功能即可,比逐行apply性能高上百倍,步骤如下:

  1. 先把日期列转为pandas datetime格式,确保时间计算正常
import pandas as pd
# 按你表中的日期格式修改format参数即可
df['cikistarihi'] = pd.to_datetime(df['cikistarihi'], format='%d.%m.%Y')
  1. 按物料分组,计算每个物料过去30天(不含当前发货日期)的累计发货量
# 先按物料+发货日期排序,保证时间顺序正确
df = df.sort_values(['malzeme', 'cikistarihi']).reset_index(drop=True)
# 分组滚动计算30天求和
df['shipped qtys in last 30 days'] = df.groupby('malzeme', group_keys=False)\
    .apply(lambda group: 
        group.set_index('cikistarihi')['qty']
        # 30天窗口,closed='left'表示排除当前行的发货日期,和你的筛选逻辑完全一致
        .rolling('30D', closed='left')
        .sum()
        .fillna(0)
        .values
    )

方案说明

  • 核心逻辑和你写的单行筛选代码完全一致:按物料隔离,统计早于当前发货日期、且距离当前日期不超过30天的发货量总和
  • 内置滚动窗口是向量化计算,10万行数据实测耗时在1秒以内,完全不需要逐行遍历
  • 如果一定要用你原来的逐行筛选逻辑做批量计算(非常不推荐,10万行可能要跑几分钟),可以用apply实现:
df['shipped qtys in last 30 days'] = df.apply(
    lambda row: df[
        (df['malzeme']==row['malzeme']) & 
        (df['cikistarihi'] < row['cikistarihi']) & 
        (df['cikistarihi'] >= (row['cikistarihi']-pd.Timedelta(days=30)))
    ]['qty'].sum(), 
    axis=1
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 08:24:05