Python中如何基于DataFrame的start_time、end_time列计算各时段重叠通话数
实现方案
核心思路是按timeslot字段分组,仅在同时段内判断通话区间的重叠关系,时间区间交集判断规则为:对两个通话A(开始时间sA,结束时间eA)和B(开始时间sB,结束时间eB),满足sA < eB且sB < eA即判定为重叠。
代码实现
1. 基础实现(适合中小数据量)
import pandas as pd # 定义单时段重叠数计算函数 def calc_overlap(group): overlap_list = [] for idx, row in group.iterrows(): cur_s, cur_e = row['start_time'], row['end_time'] # 统计同组内与当前通话重叠的数量,减1排除自身 cnt = ((group['start_time'] < cur_e) & (group['end_time'] > cur_s)).sum() - 1 overlap_list.append(cnt) group['overlap'] = overlap_list return group # 按timeslot分组应用计算 df = df.groupby('timeslot', group_keys=False).apply(calc_overlap)
2. 高性能实现(适合十万级以上数据量)
用numpy广播替代循环,运算效率提升10倍以上:
import pandas as pd import numpy as np def calc_overlap_fast(group): s_arr = group['start_time'].values e_arr = group['end_time'].values # 广播生成重叠判定矩阵 overlap_matrix = (s_arr[:, None] < e_arr) & (e_arr[:, None] > s_arr) # 每行求和后减1排除自身匹配 group['overlap'] = overlap_matrix.sum(axis=1) - 1 return group df = df.groupby('timeslot', group_keys=False).apply(calc_overlap_fast)
注意事项
- 代码已天然满足跨时段通话的计算要求:跨时段通话仅会和自身归属
timeslot内的其他通话做重叠判断,不会和其他时段的通话比较。 - 运行前请确保
start_time和end_time字段已转换为datetime64[ns]类型,否则时间比较会出错。
内容的提问来源于stack exchange,提问作者Chirag Patankar
相关产品推荐
相关产品推荐

