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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:36:01