如何用pandas统计会议时段落在各30分钟标准时间块内的分钟数
高效Pandas实现方案
核心思路是先将每条会议记录拆分为它所覆盖的所有30分钟标准块,再通过向量运算直接计算每个块内的会议时长,最后按块聚合求和,全程无需手动循环和标记位判断。
完整实现代码
import pandas as pd # 你的原始数据 data_1 = { 'ID':['123'], "Start_time" :[pd.Timestamp('08:40')], "End_time" :[pd.Timestamp('10:01')]} df_1 = pd.DataFrame(data_1) # 处理逻辑 # 1. 拆分每条会议到所有覆盖的30分钟块 df_expand = df_1.assign( # 计算会议覆盖的第一个块、最后一个块的边界 first_block = lambda x: x['Start_time'].dt.floor('30min'), last_block = lambda x: x['End_time'].dt.ceil('30min') ).explode( # 生成所有覆盖的块起始时间 'block_start' = lambda x: x.apply( lambda row: pd.date_range(row['first_block'], row['last_block'], freq='30min', closed='left'), axis=1 ) ).assign( block_end = lambda x: x['block_start'] + pd.Timedelta(minutes=30), # 计算当前块内的会议时长:取两个区间的重叠部分长度 meeting_minutes = lambda x: ( x[['End_time', 'block_end']].min(axis=1) - x[['Start_time', 'block_start']].max(axis=1) ).dt.total_seconds() / 60 ).query('meeting_minutes > 0') # 过滤无效的0时长块 # 2. 按时间块聚合得到总分钟数 result = df_expand.groupby(['block_start', 'block_end'], as_index=False)['meeting_minutes'].sum()
样例输出
针对你给出的8:40-10:01的会议,最终result结果如下:
| block_start | block_end | meeting_minutes |
|---|---|---|
| 2024-xx-xx 08:30 | 2024-xx-xx 09:00 | 20 |
| 2024-xx-xx 09:00 | 2024-xx-xx 09:30 | 30 |
| 2024-xx-xx 09:30 | 2024-xx-xx 10:00 | 30 |
| 2024-xx-xx 10:00 | 2024-xx-xx 10:30 | 1 |
方案优势
- 全程使用pandas向量化操作,没有显式逐行循环,处理万级以上数据时效率远高于手动迭代
- 无需额外定义标记位和多分支判断,逻辑更简洁易维护
- 自动适配跨多个块的长会议、刚好卡在块边界的会议等各种边界场景
内容的提问来源于stack exchange,提问作者big sad
相关产品推荐
相关产品推荐

