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

Pandas按指定时间范围识别重复项并标记父重复项及统计重复数

Pandas 实现按ID、金额、5分钟时间间隔识别重复记录方案

实现思路

  • 先将日期列转为Pandas datetime类型,支撑时间差运算
  • 按ID、Amount分组,对组内数据按时间升序排序
  • 计算组内相邻记录的时间差,超过5分钟就标记为新的重复组
  • 给每个重复组分配唯一标识,统计组内记录总数
  • 标记每个重复组的第一条记录为父重复项

完整实现代码

import pandas as pd

# 构造示例数据,实际使用时替换为自己的数据源导入逻辑即可
data = {
    'ID': [1,1,1,1,1,2,2,2],
    'Amount': [23,23,23,23,24,43,43,432],
    'Date': [
        '3/1/2021 12:00PM', '3/1/2021 12:01PM', '3/1/2021 12:05PM', '3/1/2021 12:09PM',
        '3/2/2021 12:05PM', '3/1/2021 12:00PM', '3/1/2021 12:01PM', '3/1/2021 12:05PM'
    ]
}
df = pd.DataFrame(data)

# 1. 转换日期列为标准datetime格式,注意匹配自己的日期字符串格式
df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y %I:%M%p')

# 2. 按ID、Amount分组后按时间排序,保证时间顺序正确
df = df.sort_values(['ID', 'Amount', 'Date']).reset_index(drop=True)

# 3. 计算组内相邻记录的时间差,单位为分钟
df['time_diff'] = df.groupby(['ID', 'Amount'])['Date'].diff().dt.total_seconds() / 60
# 标记新重复组的起点:首条记录/和前一条间隔超过5分钟
df['new_group'] = (df['time_diff'].isna()) | (df['time_diff'] > 5)

# 4. 给每个重复组分配唯一ID
df['dup_group_id'] = df.groupby(['ID', 'Amount'])['new_group'].cumsum()

# 5. 统计每个重复组的总记录数(包含父项)
df['group_total_count'] = df.groupby(['ID', 'Amount', 'dup_group_id'])['dup_group_id'].transform('count')

# 6. 标记父重复项:每个重复组的第一条记录
df['is_parent'] = df.groupby(['ID', 'Amount', 'dup_group_id']).cumcount() == 0

# 可选:删除中间计算产生的辅助列
df = df.drop(columns=['time_diff', 'new_group'])

结果说明

注:上述代码采用相邻时间差判定逻辑,即组内只要相邻两条间隔<=5分钟就归为同一个重复组,适用于连续触发的重复场景。如果需要所有记录和组内第一条的间隔<=5分钟才算同一组,将new_group的判定逻辑替换为和组内首条记录的时间差对比即可。

以示例数据为例,运行后ID=1、Amount=23的前4条记录相邻间隔均不超过5分钟,会被归为同一个重复组,组总数量为4,12:00的第一条记录标记为父项;12:09的记录和前一条12:05间隔4分钟,符合规则会被纳入同一组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:27:05