Pandas如何筛选同一用户同一门店间隔在指定时长内的事件
实现步骤
- 转换时间字段格式:将字符串类型的timestamp转换为Pandas datetime格式,支持时间差运算
- 分组排序:按
user_id、store_id分组,组内按时间升序排列,保证同用户同门店的事件按发生顺序排列 - 计算相邻时间差:分别计算当前行与上一行、当前行与下一行的时间间隔,避免遗漏相邻满足条件的记录
- 条件筛选:保留满足时间间隔小于等于指定阈值的记录
完整可运行代码
import pandas as pd # 构造示例数据,实际使用时替换为你的DataFrame即可 data = { 'user_id': ['user_1', 'user_1', 'user_1', 'user_2', 'user_2', 'user_3', 'user_4', 'user_4'], 'timestamp': ['2021-11-26T13:40:00.000Z', '2021-11-26T12:20:00.000Z', '2021-11-22T16:10:00.000Z', '2021-11-19T22:00:00.000Z', '2021-11-19T19:50:00.000Z', '2021-11-28T06:10:00.000Z', '2021-11-18T16:30:00.000Z', '2021-11-18T16:20:00.000Z'], 'store_id': ['store_1', 'store_1', 'store_1', 'store_2', 'store_2', 'store_1', 'store_3', 'store_2'] } df = pd.DataFrame(data) # 1. 转换时间格式 df['timestamp'] = pd.to_datetime(df['timestamp']) # 2. 按用户、门店、时间升序排序 df_sorted = df.sort_values(['user_id', 'store_id', 'timestamp']).reset_index(drop=True) # 3. 计算组内前后相邻行的时间差 group = df_sorted.groupby(['user_id', 'store_id'])['timestamp'] df_sorted['prev_diff'] = group.diff() df_sorted['next_diff'] = group.diff(-1).abs() # 4. 设定时间间隔阈值,可按需调整 time_threshold = pd.Timedelta(hours=2) # 5. 筛选满足条件的记录,删除辅助列 result = df_sorted[(df_sorted['prev_diff'] <= time_threshold) | (df_sorted['next_diff'] <= time_threshold)]\ .drop(columns=['prev_diff', 'next_diff'])\ .reset_index(drop=True) print(result)
输出结果
运行上述代码得到的结果和预期完全一致,仅保留user_1的两条符合要求的记录:
user_id timestamp store_id 0 user_1 2021-11-26 12:20:00+00:00 store_1 1 user_1 2021-11-26 13:40:00+00:00 store_1
注意事项
- 时间阈值可灵活调整,例如要设置为30分钟可修改为
pd.Timedelta(minutes=30),设置为1天修改为pd.Timedelta(days=1)即可 - 如果需要筛选连续3条及以上满足间隔的记录,可扩展辅助列计算连续满足间隔的长度,调整判断逻辑即可
内容的提问来源于stack exchange,提问作者josetribiani
相关产品推荐
相关产品推荐

