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

Pandas如何统计同姓名下连续重叠时间记录并判断组长度是否≥3

实现步骤与完整代码

首先完成基础数据预处理,再按姓名分组识别连续重叠块,最后生成要求的两个标志字段即可:

import pandas as pd
import io

# 可替换为自身数据源,此处先用示例1测试,替换为示例2代码也可正常运行
df = pd.read_csv(io.StringIO("""
Record ID;Record Name;Record Start;Record End
1;SMITH, JOHN;10/20/20 8:00 AM;10/20/20 9:30 AM
2;SMITH, JOHN;10/20/20 9:20 AM;10/20/20 10:30 AM
3;SMITH, JOHN;10/20/20 10:20 AM;10/20/20 11:00 AM
4;SMITH, JOHN ;10/20/20 1:00 PM;10/20/20 2:15 PM
5;SMITH, JOHN;10/20/20 2:00 PM;10/20/20 4:00 PM
"""),sep=';')

# 1. 数据预处理
# 去除姓名字段前后空格,避免分组异常
df['Record Name'] = df['Record Name'].str.strip()
# 将起止时间转为datetime类型,保证时间比较逻辑正确
df['Start'] = pd.to_datetime(df['Record Start'])
df['End'] = pd.to_datetime(df['Record End'])

# 2. 按姓名分组处理连续重叠逻辑
def process_group(group):
    # 按记录ID升序排序,保证时序判断正确
    group = group.sort_values('Record ID').reset_index(drop=True)
    # 标记当前记录是否与上一条记录重叠
    group['prev_overlap'] = group['Start'] < group['End'].shift(1)
    # 生成连续重叠块的分组ID:遇到不重叠的位置ID+1
    group['block_id'] = (~group['prev_overlap']).cumsum()
    # 统计每个连续重叠块的记录条数
    group['block_size'] = group.groupby('block_id')['block_id'].transform('count')
    # 生成要求的两个标志字段
    group['overlap?'] = group['block_size'] >= 2
    group['total records consec >=3?'] = group['block_size'] >= 3
    return group

# 应用分组处理逻辑
df = df.groupby('Record Name', group_keys=False).apply(process_group)
# 删除中间计算用的辅助列
df = df.drop(columns=['prev_overlap', 'block_id', 'block_size'])

# 输出结果
print(df)
结果验证
  • 测试示例1时输出完全匹配预期:前3条属于大小为3的重叠块,两个标志均为True;后2条属于大小为2的重叠块,overlap?为True,total records consec >=3?为False。
  • 测试示例2时所有重叠块最大长度为2,因此total records consec >=3?全为False,与预期输出一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:27:04