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

如何用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_startblock_endmeeting_minutes
2024-xx-xx 08:302024-xx-xx 09:0020
2024-xx-xx 09:002024-xx-xx 09:3030
2024-xx-xx 09:302024-xx-xx 10:0030
2024-xx-xx 10:002024-xx-xx 10:301

方案优势

  • 全程使用pandas向量化操作,没有显式逐行循环,处理万级以上数据时效率远高于手动迭代
  • 无需额外定义标记位和多分支判断,逻辑更简洁易维护
  • 自动适配跨多个块的长会议、刚好卡在块边界的会议等各种边界场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:24:03