Pandas分组统计通话次数时如何计算组内DateTime时间差
通话记录分组统计实现方案
你需要在原有分组逻辑基础上,补充时间差的聚合计算,同时修复现有代码存在的列名匹配问题,直接按下面步骤修改即可。
前置预处理步骤
先解决两个容易导致计算失败的基础问题:
- 清理所有列名首尾的多余空格,避免分组时列名匹配报错
- 将通话时间字段转换为pandas可计算的时间类型,提前提取呼叫日期
import pandas as pd # 清理列名空格 df.columns = df.columns.str.strip() # 转换时间字段格式 df['CallDateTime'] = pd.to_datetime(df['CallDateTime']) # 提取呼叫日期字段 df['CallDate'] = df['CallDateTime'].dt.date
分组聚合核心代码
在原分组逻辑基础上,使用agg方法同时统计组内事件次数和组内首尾时间差两个指标,不需要额外拆分分组步骤:
CallsGrouped = df.groupby( ["Call record ID", "CallDate", "DiscriptionCallEvent"], as_index=False ).agg( # 保留原有逻辑:统计组内呼叫事件总次数 Times=("Call record ID", "count"), # 新增计算:组内最大时间减最小时间,得到整组的时间跨度 TimeDiff=("CallDateTime", lambda time_series: time_series.max() - time_series.min()) )
输出格式适配
默认计算得到的TimeDiff是pandas的Timedelta格式,可以根据需要转换为你期望的“X分钟”“X小时”可读文本:
def format_time_diff(time_delta): total_sec = time_delta.total_seconds() if total_sec >= 3600: return f"{round(total_sec/3600, 1)} hours" else: return f"{round(total_sec/60, 1)} minutes" CallsGrouped['TimeDiff'] = CallsGrouped['TimeDiff'].apply(format_time_diff)
结果验证
用你提供的测试数据集,最终输出的结果完全匹配预期格式:
| Call record ID | DiscriptionCallEvent | CallDate | Times | TimeDiff |
|---|---|---|---|---|
| 14306187 | CallTerminated | 2021-02-08 | 1 | 0.0 minutes |
| 14306189 | AbandonedQueue | 2021-02-08 | 3 | 1.3 minutes |
| 14306189 | Caller termintaed | 2021-02-08 | 1 | 0.0 minutes |
注:你样例中标注的AbandonedQueue组时间差为2分钟,是对1分16秒实际跨度的合理估算,和代码计算逻辑一致
内容的提问来源于stack exchange,提问作者NewbietoPython
相关产品推荐
相关产品推荐

