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

如何用Pandas基于1小时时间差标记指定字段的重复记录?

高效处理带时间间隔的重复项标记

针对30万条记录的场景,绝对不能用全局循环,会慢到离谱。下面给你一套基于Pandas向量化操作的高效方案,核心思路是先按「姓名+出生日期」分组,再在每组内用时间窗口识别1小时内的重复项:

步骤1:预处理时间列

首先得把CSV里的timestamp列转换成Pandas能识别的datetime类型,否则没法做时间计算:

import pandas as pd

# 读取数据并转换时间格式
df = pd.read_csv("input.csv")
df['timestamp'] = pd.to_datetime(df['timestamp'])

步骤2:分组+滚动时间窗口标记重复

这里用分组+滚动时间窗口的方式,完全避开循环,效率拉满:

# 定义分组键:用来识别「同一人」的字段
group_keys = ['Forename','Surname', 'Day of Birth', 'Month of Birth', 'Year of Birth']

# 按分组键+时间排序,保证后续窗口计算的准确性
df_sorted = df.sort_values(by=group_keys + ['timestamp']).reset_index(drop=True)

# 核心逻辑:对每个分组,用1小时的时间滚动窗口,窗口内记录数>1即为重复
df_sorted['Duplicate'] = df_sorted.groupby(group_keys, as_index=False)['timestamp'].rolling(
    window='1h', on='timestamp'
).count().reset_index(level=0, drop=True) > 1

# 保存结果
df_sorted.to_csv('output.csv', index=False)

方案说明

  • 分组操作:先把同一人(姓名+出生日期匹配)的记录归为一组,只在组内检查时间重复,避免跨组误判
  • 滚动时间窗口:Pandas的rolling('1h')会自动为每条记录生成一个「往前1小时」的窗口,窗口内如果有其他记录(计数>1),就标记为重复项
  • 效率:全程是Pandas底层优化的向量化操作,处理30万条记录完全没问题,比循环快几十倍

如果你的Pandas版本较低,不支持rolling直接指定on参数,可以用下面的兼容版本:

def mark_group_duplicates(group):
    # 把时间设为分组内的索引并排序
    group = group.set_index('timestamp').sort_index()
    # 1小时窗口内计数>1即为重复
    group['Duplicate'] = group.rolling('1h').count()['Forename'] > 1
    # 恢复原索引
    return group.reset_index()

# 应用到每个分组
df_result = df.groupby(group_keys, sort=False).apply(mark_group_duplicates).reset_index(drop=True)
df_result.to_csv('output.csv', index=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 10:10:32