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

基于行条件与日期区间的Python DataFrame值求和实现

Python实现多条件日期区间的SUMIF式求和

步骤1:统一日期格式

首先需要将所有涉及日期的列转换为datetime类型,否则无法进行日期区间比较:

import pandas as pd

# 转换df1的日期列
df1['date'] = pd.to_datetime(df1['date'])
# 转换df2的日期列
df2['date'] = pd.to_datetime(df2['date'])
# 转换df3的日期列
df3['open'] = pd.to_datetime(df3['open'])
df3['invent'] = pd.to_datetime(df3['invent'])

步骤2:计算符合条件的sale总和

通过merge关联df1和df3(匹配loja和item),筛选出日期在open和invent区间内的记录,再分组求和:

# 关联df1与df3,匹配loja和item
merged_sale = pd.merge(df1, df3, on=['loja', 'item'], how='inner')
# 筛选日期在区间内的记录
filtered_sale = merged_sale[(merged_sale['date'] >= merged_sale['open']) & (merged_sale['date'] <= merged_sale['invent'])]
# 按loja和item分组求和
sale_sum = filtered_sale.groupby(['loja', 'item'])['sale'].sum().reset_index(name='sale')

步骤3:计算符合条件的buy总和

用同样的逻辑处理df2:

# 关联df2与df3,匹配loja和item
merged_buy = pd.merge(df2, df3, on=['loja', 'item'], how='inner')
# 筛选日期在区间内的记录
filtered_buy = merged_buy[(merged_buy['date'] >= merged_buy['open']) & (merged_buy['date'] <= merged_buy['invent'])]
# 按loja和item分组求和
buy_sum = filtered_buy.groupby(['loja', 'item'])['buy'].sum().reset_index(name='buy')

步骤4:合并结果并填充缺失值

将求和结果与df3合并,确保所有df3中的记录都被保留,缺失的求和值填充为0:

# 先合并sale_sum到df3
result = pd.merge(df3, sale_sum, on=['loja', 'item'], how='left')
# 再合并buy_sum到结果
result = pd.merge(result, buy_sum, on=['loja', 'item'], how='left')
# 填充缺失值为0
result[['sale', 'buy']] = result[['sale', 'buy']].fillna(0).astype(int)
# 调整列顺序与期望结果一致
result = result[['loja', 'item', 'open', 'invent', 'buy', 'sale']]

最终结果

运行上述代码后,result将与你期望的输出一致:

loja   item       open     invent  buy  sale
0  9288  97845 2022-12-01 2022-12-20  684    21
1  9925  33515 2022-12-02 2022-12-12  364  1302
2  9288  33515 2022-12-01 2022-12-20    0     0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:25:18