如何用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
相关产品推荐
相关产品推荐

