如何按天分组CSV行数据 实现同日重复testID去重保留最新记录
解决方案
不需要手动拆分每日子集循环处理,只需要在去重判断时加入「自然日」作为联合判定维度,即可一次完成全量数据清洗,不会误删跨日的同testID有效记录,对大型CSV文件的处理效率也更高。
实现步骤
基础数据预处理
首先将时间列转为标准datetime格式,并按时间升序排序,保证同组内最后一条记录为时间最新的条目:import pandas as pd # 读取本地CSV文件 df = pd.read_csv("你的测试数据文件路径.csv") # 转换date列为时间格式 df["date"] = pd.to_datetime(df["date"]) # 按时间正序排序,重置索引 df = df.sort_values(by="date", ascending=True).reset_index(drop=True)按规则去重
我们把「自然日(年月日,不含时分秒)」和testID共同作为去重判定字段,这样去重范围会被严格限制在「同一天内的相同testID」,跨天的同testID记录因为自然日字段不同,不会被判定为重复:# 方法1:基于drop_duplicates实现,逻辑直观 # 生成自然日辅助列 df["day_tag"] = df["date"].dt.date # 去重:同天同testID仅保留最后一条(即时间最新的记录) df_clean = df.drop_duplicates(subset=["day_tag", "testID"], keep="last") # 删除不需要的辅助列 df_clean = df_clean.drop(columns=["day_tag"]).reset_index(drop=True)如果你不想生成额外辅助列,也可以直接用分组取尾的方式实现,结果完全一致:
# 方法2:基于groupby实现,无需额外辅助列 df_clean = df.groupby([df["date"].dt.date, "testID"], as_index=False).tail(1)
效果验证
用给出的示例数据运行上述代码,最终输出结果完全符合规则要求:
- 2022-05-31的两条A123记录,仅保留15:42:46的最新条目
- 2022-06-01的A123记录属于不同自然日,正常保留
- 其余无重复的testID记录全部留存
之前直接用
testID作为单一去重字段的写法,本质是全局范围内同testID仅保留一条,自然会误删跨日的有效记录,加入自然日维度做联合判断后,就完全匹配业务规则了。
内容的提问来源于stack exchange,提问作者Deez
相关产品推荐
相关产品推荐

