Python实现带唯一日期范围的SUMIF等效功能:按产品区间汇总销售额
解决方法:按产品促销日期范围汇总区域销售额
首先,先模拟符合你场景的测试数据(确保日期为datetime类型,方便做范围判断):
import pandas as pd import numpy as np # 模拟按区域+周统计的销售数据 sales_df = pd.DataFrame({ 'Area': ['North', 'North', 'North', 'South', 'South', 'South'], 'Week': pd.to_datetime(['2019-02-01', '2019-02-08', '2019-02-15', '2019-02-01', '2019-02-08', '2019-02-15']), 'Sales': [100, 200, 150, 120, 250, 180] }) # 模拟各产品促销起止周数据 sales_period_df = pd.DataFrame({ 'Product': ['Boots', 'Shirts'], 'Start_Week': pd.to_datetime(['2019-02-08', '2019-02-01']), 'End_Week': pd.to_datetime(['2019-02-15', '2019-02-08']) })
方法1:循环处理单个产品(适合产品数量少的场景)
遍历每个产品的促销周期,过滤出对应日期范围的销售数据后按区域汇总,最后合并结果:
# 初始化空结果表 final_summary = pd.DataFrame() # 遍历每个产品的促销周期 for _, promo_row in sales_period_df.iterrows(): product_name = promo_row['Product'] start_date = promo_row['Start_Week'] end_date = promo_row['End_Week'] # 筛选当前产品促销期内的销售数据,按区域求和 filtered_sales = sales_df[(sales_df['Week'] >= start_date) & (sales_df['Week'] <= end_date)] product_sales = filtered_sales.groupby('Area')['Sales'].sum().reset_index() # 重命名列,区分不同产品的促销销售额 product_sales.rename(columns={'Sales': f'{product_name}_Promo_Sales'}, inplace=True) # 合并到结果表 if final_summary.empty: final_summary = product_sales else: final_summary = pd.merge(final_summary, product_sales, on='Area', how='outer') print(final_summary)
方法2:交叉合并+布尔过滤(适合产品数量多的高效场景)
通过交叉合并让每条销售数据关联所有产品的促销周期,再判断是否在促销期内,最后汇总:
# 交叉合并两个表(生成每条销售数据对应所有产品的组合) merged_data = pd.merge(sales_df.assign(join_key=1), sales_period_df.assign(join_key=1), on='join_key').drop('join_key', axis=1) # 标记销售周是否在对应产品的促销范围内 merged_data['is_promo_period'] = (merged_data['Week'] >= merged_data['Start_Week']) & (merged_data['Week'] <= merged_data['End_Week']) # 仅保留促销期内的数据,按区域+产品汇总销售额,再转成宽表 summary_table = merged_data[merged_data['is_promo_period']].groupby(['Area', 'Product'])['Sales'].sum().unstack() # 重命名列名 summary_table.columns = [f'{col}_Promo_Sales' for col in summary_table.columns] summary_table = summary_table.reset_index() print(summary_table)
为什么你的原代码不生效
你之前的pivot_table直接将sales_period_df['Product']作为列,但没有建立销售数据和产品促销周期的关联,相当于把所有周的销售额都按产品列拆分,完全没用到日期过滤逻辑。上面的两种方法都是先把销售周是否属于对应产品促销期的判断加上,再做汇总,正好对应Excel中SUMIF带日期条件的逻辑。
内容的提问来源于stack exchange,提问作者MaivishM
相关产品推荐
相关产品推荐

