如何用Pandas匹配Zoom参会时间区间并生成有效参会场次新列
Pandas实现Zoom参会有效场次匹配方案
实现思路
- 先拆分会议场次的时间区间为独立的开始、结束时间字段,统一转换所有时间字段为datetime格式
- 关联参会记录与全量会议场次,计算每条参会记录和每场会议的重叠时长
- 按参会者+场次维度聚合总停留时长,过滤掉总时长不足10分钟的场次
- 按参会者ID聚合,得到每人的有效参会场次列表
完整实现代码
import pandas as pd # ---------------------- 1. 构造样例数据 ---------------------- # 会议场次表 session_df = pd.DataFrame({ "Session": ["Apples", "Oranges", "Pineapples"], "Time": ["8:00-8:30", "8:30-9:00", "9:00-9:30"] }) # 拆分场次时间为开始、结束时间,转datetime格式 session_df[["session_start", "session_end"]] = session_df["Time"].str.split("-", expand=True) session_df["session_start"] = pd.to_datetime(session_df["session_start"]) session_df["session_end"] = pd.to_datetime(session_df["session_end"]) # 参会记录表(可替换为实际读取的数据源) attend_df = pd.DataFrame({ "Participant": ["U001", "U001", "U002", "U003"], "Join Time": ["8:05", "8:40", "8:20", "8:55"], "Leave Time": ["8:35", "9:20", "8:28", "9:35"] }) # 转换入会/退会时间为datetime格式 attend_df["Join Time"] = pd.to_datetime(attend_df["Join Time"]) attend_df["Leave Time"] = pd.to_datetime(attend_df["Leave Time"]) # ---------------------- 2. 匹配场次计算重叠时长 ---------------------- # 交叉连接:每条参会记录匹配所有会议场次 cross_df = attend_df.merge(session_df, how="cross") # 计算重叠时间区间 cross_df["overlap_start"] = cross_df[["Join Time", "session_start"]].max(axis=1) cross_df["overlap_end"] = cross_df[["Leave Time", "session_end"]].min(axis=1) # 过滤无重叠的匹配结果 cross_df = cross_df[cross_df["overlap_start"] < cross_df["overlap_end"]].copy() # 计算单条记录重叠时长(单位:分钟) cross_df["overlap_min"] = (cross_df["overlap_end"] - cross_df["overlap_start"]).dt.total_seconds() / 60 # ---------------------- 3. 按规则过滤并聚合结果 ---------------------- # 按参会者+场次分组,统计单场累计停留时长 valid_session = cross_df.groupby(["Participant", "Session"], as_index=False)["overlap_min"].sum() # 过滤停留时长不足10分钟的无效场次 valid_session = valid_session[valid_session["overlap_min"] >= 10] # 按参会者ID聚合,得到有效场次列表 result = valid_session.groupby("Participant")["Session"].agg(list).reset_index() result.rename(columns={"Session": "Engaged Sessions"}, inplace=True) print(result)
样例输出说明
以上述测试数据为例,最终输出结果如下:
| Participant | Engaged Sessions |
|---|---|
| U001 | ['Apples', 'Oranges', 'Pineapples'] |
| U003 | ['Pineapples'] |
说明:U002在Apples场次仅停留8分钟,不符合规则不计入结果
内容的提问来源于stack exchange,提问作者Denisse
相关产品推荐
相关产品推荐

