You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Python Pandas计算去重叠区间后的客户有效处理总时长

解决用户每日无重叠有效处理总时长计算问题

我明白你现在遇到的痛点——计算无重叠的会话总时长确实比看起来要棘手,尤其是当不同会话的时间区间交叉的时候。咱们基于你已经完成的初步数据转换,一步步来解决这个问题。

先确认当前数据结构

你已经完成了关键的数据转换,得到了包含contact_start(会话开始时间)、contact_finish(会话结束时间)、name(用户)和date(日期)的数据集,这为后续处理打下了很好的基础。

核心思路:合并重叠区间再计算总时长

要得到无重叠的有效时长,我们需要:

  • 用户+日期分组,确保我们只处理同一用户同一天的会话
  • 对每个分组内的会话按开始时间排序
  • 合并所有重叠或连续的时间区间
  • 计算合并后所有区间的总时长

具体实现代码

1. 补充转换(可选但更方便)

aht转回秒数,方便后续验证计算:

# 将aht从时间格式转回秒数,用于后续结果验证
df['aht_sec'] = pd.to_timedelta(df['aht']).dt.total_seconds()

2. 定义处理单用户单日区间的函数

这个函数负责完成排序、合并重叠区间并计算总时长的核心逻辑:

def calculate_non_overlapping_duration(group):
    # 按会话开始时间排序,这是合并重叠区间的必要前提
    sorted_group = group.sort_values('contact_start')
    
    # 初始化列表存储合并后的时间区间
    merged_intervals = []
    for _, row in sorted_group.iterrows():
        current_start = row['contact_start']
        current_end = row['contact_finish']
        
        # 如果列表为空,直接添加第一个区间
        if not merged_intervals:
            merged_intervals.append([current_start, current_end])
        else:
            # 获取最后一个已合并的区间
            last_start, last_end = merged_intervals[-1]
            # 如果当前区间与最后一个合并区间重叠或连续,就合并它们
            if current_start <= last_end:
                # 更新结束时间为两个区间的最大值
                merged_intervals[-1][1] = max(last_end, current_end)
            else:
                # 无重叠,添加新的独立区间
                merged_intervals.append([current_start, current_end])
    
    # 计算所有合并后区间的总时长(转换为秒)
    total_seconds = sum((end - start).total_seconds() for start, end in merged_intervals)
    return pd.Series({'total_duration_sec': total_seconds})

3. 分组应用函数得到最终结果

# 按日期和用户分组,应用上面的处理函数
final_result = df.groupby(['date', 'name']).apply(calculate_non_overlapping_duration).reset_index()

验证你的示例数据

用你提供的测试数据运行后,final_result会和你预期的结果完全一致:

  • Venus的前两个会话(09:58-10:01 和 10:00-10:04)重叠,合并后为09:58-10:04(时长360秒),加上第三个会话的60秒,总时长420秒
  • Mars的两个会话无重叠,总时长30+30=60秒

适配你的CSV样本数据

如果你的CSV样本数据结构和测试数据一致(包含contact_startnameaht字段),只需要先完成你已经做的初步转换,再运行上面的代码即可。如果有特殊情况(比如跨天的会话),可以微调函数里的合并逻辑,但这个基础版本已经能覆盖大部分场景。

内容的提问来源于stack exchange,提问作者segababa

火山引擎 最新活动