如何用Pandas实现按日期的增量呼叫量累加计算?
问题描述
现有一份记录不同区域增量呼叫数据的Pandas DataFrame,结构包含CommsDate、Area、Day0 Incremental、Day1 Incremental、Day2 Incremental字段。需按日期计算各区域总呼叫量:
- 1月1日:取当日
Day0 Incremental - 1月2日:当日
Day0 Incremental+ 前一日Day1 Incremental - 1月3日及之后:当日
Day0 Incremental+ 前一日Day1 Incremental+ 前两日Day2 Incremental
已完成目标DataFrame框架搭建,但后续计算步骤卡壳,寻求解决方案。
解决方案
第一步:简化目标DataFrame框架搭建
原始框架代码可以简化,无需反复melt和pivot,直接生成完整日期序列后构建空表:
import pandas as pd from datetime import timedelta # 预处理原始数据 df['CommsDate'] = pd.to_datetime(df['CommsDate'], format='%d/%m/%Y') area_unique = df['Area'].unique().tolist() min_date = df['CommsDate'].min() max_date = df['CommsDate'].max() + timedelta(days=6) full_date_range = pd.date_range(start=min_date, end=max_date, freq='D') # 生成空的目标DataFrame df_new = pd.DataFrame({'CallDate': full_date_range})
第二步:实现呼叫量计算逻辑
按区域遍历处理,通过日期偏移匹配对应增量字段,最终合并结果:
for area in area_unique: # 提取当前区域的原始数据,设置日期为索引 area_df = df[df['Area'] == area].set_index('CommsDate')[['Day0 Incremental', 'Day1 Incremental', 'Day2 Incremental']] # 将原始数据对齐到完整日期序列,缺失日期的增量填充0 area_full = area_df.reindex(full_date_range, fill_value=0) # 计算每日总呼叫量:当日Day0 + 前一日Day1 + 前两日Day2 total_calls = area_full['Day0 Incremental'] + \ area_full['Day1 Incremental'].shift(1).fillna(0) + \ area_full['Day2 Incremental'].shift(2).fillna(0) # 将结果写入目标DataFrame df_new[area] = total_calls # 调整列顺序(保持CallDate在前,区域列按原始顺序排列) df_new = df_new[['CallDate'] + area_unique]
关键逻辑说明
shift(1)/shift(2):分别获取前一日、前两日的增量数据fillna(0):处理日期开头的偏移缺失值(比如1月1日没有前序日期,对应增量记为0)- 按区域拆分处理:避免多区域数据交叉干扰,逻辑更清晰易维护
完整可运行示例
import pandas as pd from datetime import timedelta # 模拟原始数据 data = { 'CommsDate': ['01/01/2024', '02/01/2024', '03/01/2024', '01/01/2024', '02/01/2024'], 'Area': ['North', 'North', 'North', 'South', 'South'], 'Day0 Incremental': [100, 150, 200, 80, 120], 'Day1 Incremental': [50, 70, 80, 40, 60], 'Day2 Incremental': [30, 40, 50, 20, 30] } df = pd.DataFrame(data) # 预处理+框架搭建 df['CommsDate'] = pd.to_datetime(df['CommsDate'], format='%d/%m/%Y') area_unique = df['Area'].unique().tolist() min_date = df['CommsDate'].min() max_date = df['CommsDate'].max() + timedelta(days=6) full_date_range = pd.date_range(start=min_date, end=max_date, freq='D') df_new = pd.DataFrame({'CallDate': full_date_range}) # 计算各区域总呼叫量 for area in area_unique: area_df = df[df['Area'] == area].set_index('CommsDate')[['Day0 Incremental', 'Day1 Incremental', 'Day2 Incremental']] area_full = area_df.reindex(full_date_range, fill_value=0) total_calls = area_full['Day0 Incremental'] + \ area_full['Day1 Incremental'].shift(1).fillna(0) + \ area_full['Day2 Incremental'].shift(2).fillna(0) df_new[area] = total_calls df_new = df_new[['CallDate'] + area_unique] print(df_new)
内容的提问来源于stack exchange,提问作者HanRei
相关产品推荐
相关产品推荐

