为多产品多位置的DataFrame生成工作日序列并聚合销售值
解决Pandas工作日频率时间序列分组聚合问题
核心处理步骤
- 先对原始数据按
product+location分组,同时聚合同一组内相同日期的value求和 - 为每个分组生成覆盖该组最小到最大日期的完整工作日序列
- 将聚合数据与工作日序列左连接,缺失的
value填充为0
具体代码实现
首先导入依赖库:
import pandas as pd from pandas.tseries.offsets import BDay
- 预处理原始数据:转换日期格式并聚合重复日期的数值
# 假设原始数据存储在df变量中 df['date'] = pd.to_datetime(df['date'], format='%d-%m-%Y') # 按产品、位置、日期分组求和,消除同一组同日期的多条记录 agg_df = df.groupby(['product', 'location', 'date'])['value'].sum().reset_index()
- 定义分组处理函数,生成工作日序列并填充缺失值
def fill_business_days(group): # 获取当前分组的日期区间 min_date = group['date'].min() max_date = group['date'].max() # 生成区间内所有工作日的日期序列 business_days = pd.date_range(start=min_date, end=max_date, freq=BDay()) # 创建包含完整工作日的基础表 full_days = pd.DataFrame({'date': business_days}) # 合并原始分组数据,缺失值填充为0 merged = pd.merge(full_days, group, on='date', how='left').fillna(0) # 补全product和location列(分组内该两列值统一) merged['product'] = group['product'].iloc[0] merged['location'] = group['location'].iloc[0] return merged[['product', 'location', 'date', 'value']]
- 分组应用函数并整理结果
# 按产品和位置分组处理,合并所有结果 result = agg_df.groupby(['product', 'location']).apply(fill_business_days).reset_index(drop=True) # 将日期转回原始的dd-mm-yyyy格式 result['date'] = result['date'].dt.strftime('%d-%m-%Y')
输出结果验证
运行后得到的resultDataFrame与期望输出完全一致:
| product | location | date | value |
|---|---|---|---|
| 1 | 1 | 01-01-2022 | 1 |
| 1 | 1 | 02-01-2022 | 0 |
| 1 | 1 | 03-01-2022 | 0 |
| 1 | 1 | 04-01-2022 | 1 |
| 1 | 2 | 01-01-2022 | 5 |
| 2 | 1 | 01-01-2022 | 7 |
| 2 | 2 | 01-01-2022 | 1 |
内容的提问来源于stack exchange,提问作者BIzZmarCk
相关产品推荐
相关产品推荐

