使用Pandas按ID和日期去重:保留最大Timestamp记录
保留同一ID对应日期中Timestamp最大记录的实现方案
需求说明
同一ID下存在同一日期的多条重复记录,需保留每个ID对应日期中Timestamp最大的记录,删除其余重复项。
示例输入数据
id|timestamp|value --|---------|----- 1|2022-04-19T18:46:36.259+0000|xyz 1|2022-04-19T18:46:36.302+0000|xyz 1|2022-04-19T18:46:36.357+0000|xyz 1|2022-04-24T00:41:40.871+0000|xyz 1|2022-04-24T00:41:40.879+0000|xyz 1|2022-05-02T10:15:25.829+0000|xyz 1|2022-05-02T10:15:25.832+0000|xyz
(注:原示例中2022-04-24的timestamp格式存在错误,已将秒后的冒号改为标准格式的点号)
目标输出数据
id|timestamp|value --|---------|----- 1|2022-04-19T18:46:36.357+0000|xyz 1|2022-04-24T00:41:40.879+0000|xyz 1|2022-05-02T10:15:25.832+0000|xyz
解决方案
方案1:Python Pandas实现
通过时间格式转换+分组筛选,保留每组中时间戳最大的记录:
import pandas as pd # 读取数据(假设数据为csv格式,分隔符为|) df = pd.read_csv('data.csv', sep='|') # 将timestamp列转换为可识别的datetime类型 df['timestamp'] = pd.to_datetime(df['timestamp'], format='%Y-%m-%dT%H:%M:%S.%f%z') # 方法1:排序后分组取第一条(降序排序后第一条即为最大时间戳) result = df.sort_values('timestamp', ascending=False).groupby(['id', df['timestamp'].dt.date]).first().reset_index(drop=False) # 方法2:用transform生成掩码直接筛选 max_ts = df.groupby(['id', df['timestamp'].dt.date])['timestamp'].transform('max') result = df[df['timestamp'] == max_ts] # 输出结果(可选) print(result.to_csv(sep='|', index=False))
方案2:SQL实现
利用窗口函数ROW_NUMBER()分区排序,筛选每组中时间戳最大的记录:
WITH ranked_records AS ( SELECT id, timestamp, value, -- 按id和日期分组,时间戳降序排序生成行号 ROW_NUMBER() OVER ( PARTITION BY id, DATE(timestamp) ORDER BY timestamp DESC ) AS row_num FROM your_table_name ) -- 取行号为1的记录,即每组中时间戳最大的条目 SELECT id, timestamp, value FROM ranked_records WHERE row_num = 1;
内容的提问来源于stack exchange,提问作者Datamaniac
相关产品推荐
相关产品推荐

