如何筛选pandas DataFrame中同ID且创建时间间隔1分钟内的行
解决方案:筛选同一ID下时间间隔1分钟内的记录
步骤1:准备数据与类型转换
首先确保creation_date列是datetime类型(原始数据如果是字符串必须转换),先构造示例数据测试:
import pandas as pd # 构造你的示例数据 data = { 'id': ['MP5694319-001', 'MP5694319-001', 'MP5694331-001', 'MP5694319-001'], 'creation_date': ['2024-05-29 12:58:00.489', '2024-05-29 12:58:03.489', '2024-05-29 12:58:05.489', '2024-05-29 13:03:03.489'] } df = pd.DataFrame(data) # 将字符串时间转为datetime类型 df['creation_date'] = pd.to_datetime(df['creation_date'])
步骤2:分组排序并计算时间差
按id分组后,先对每组内的时间排序(保证时间顺序正确,否则时间差计算会出错),再计算每条记录与前后记录的时间间隔:
# 按id和时间排序,重置索引 df_sorted = df.sort_values(['id', 'creation_date']).reset_index(drop=True) # 计算当前记录与上一条同id记录的时间差 df_sorted['prev_diff'] = df_sorted.groupby('id')['creation_date'].diff() # 计算当前记录与下一条同id记录的时间差(取绝对值) df_sorted['next_diff'] = df_sorted.groupby('id')['creation_date'].diff(periods=-1).abs()
步骤3:筛选符合条件的记录
只要某条记录与前一条或后一条的时间间隔≤1分钟,就保留这条记录:
# 生成筛选掩码:前后任一间隔≤1分钟 mask = (df_sorted['prev_diff'] <= pd.Timedelta(minutes=1)) | (df_sorted['next_diff'] <= pd.Timedelta(minutes=1)) # 筛选结果并移除辅助列 result = df_sorted[mask].drop(columns=['prev_diff', 'next_diff']) print(result)
运行后输出结果与预期一致:
id creation_date 0 MP5694319-001 2024-05-29 12:58:00.489 1 MP5694319-001 2024-05-29 12:58:03.489
补充说明
- 如果原始数据已经按
id和creation_date排序,可以跳过sort_values步骤,但建议保留以避免潜在的顺序问题。 - 这种方法会保留所有属于「1分钟间隔组」的记录,比如某id有3条记录两两间隔都在1分钟内,这3条都会被保留。
内容的提问来源于stack exchange,提问作者Alice
相关产品推荐
相关产品推荐

