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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:22:53