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

如何高效按时间间隔动态过滤含重复PersonID的数据集?

高效实现按PersonID筛选间隔3天以上的日期记录

给定包含重复PersonID及多条日期记录的数据集,需按以下规则筛选记录:

  • 保留每个PersonID的首条记录
  • 过滤掉与已保留记录间隔3天内的后续记录
  • 重复上述逻辑直至处理完所有记录

原数据集

PersonIDDate
12024-01-01
12024-01-02
12024-01-09
12024-01-15
22024-08-05
22024-08-06
32024-01-07
32024-01-08
32024-01-15

目标保留数据集

PersonIDDate
12024-01-01
12024-01-09
12024-01-15
22024-08-05
32024-01-07
32024-01-15

高效实现方案

1. SQL(以PostgreSQL为例)

用递归CTE可避免逐行循环,一次性完成筛选:

WITH RECURSIVE filtered_records AS (
    -- 先取每个PersonID的第一条记录
    SELECT PersonID, Date
    FROM (
        SELECT 
            PersonID, 
            Date,
            ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY Date) AS rn
        FROM original_table
    ) t
    WHERE rn = 1

    UNION ALL

    -- 递归查找下一条符合条件的记录:日期比上一条保留的日期晚3天以上,且是该用户最早的符合条件的记录
    SELECT 
        t.PersonID, 
        t.Date
    FROM filtered_records fr
    JOIN (
        SELECT 
            PersonID, 
            Date,
            ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY Date) AS rn
        FROM original_table ot
        WHERE ot.Date > (SELECT MAX(Date) FROM filtered_records WHERE PersonID = ot.PersonID) + INTERVAL '3 days'
    ) t ON fr.PersonID = t.PersonID AND t.rn = 1
)
SELECT DISTINCT PersonID, Date FROM filtered_records ORDER BY PersonID, Date;

2. Python Pandas

分组后用自定义函数遍历筛选,代码简洁高效:

import pandas as pd

# 构造原数据(实际场景可替换为读取文件)
df = pd.DataFrame({
    'PersonID': [1,1,1,1,2,2,3,3,3],
    'Date': pd.to_datetime(['2024-01-01','2024-01-02','2024-01-09','2024-01-15','2024-08-05','2024-08-06','2024-01-07','2024-01-08','2024-01-15'])
})

def filter_user_dates(group):
    # 组内按日期排序
    sorted_group = group.sort_values('Date').reset_index(drop=True)
    keep_indices = [0]  # 首条必保留
    last_kept_date = sorted_group.loc[0, 'Date']
    
    for idx in range(1, len(sorted_group)):
        current_date = sorted_group.loc[idx, 'Date']
        if (current_date - last_kept_date).days > 3:
            keep_indices.append(idx)
            last_kept_date = current_date
    
    return sorted_group.loc[keep_indices]

# 按PersonID分组应用筛选
result = df.groupby('PersonID', group_keys=False).apply(filter_user_dates)
print(result)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:11:20