如何在日志中查找Locked事件发生后的Edit事件
解决方案:识别Locked事件后的Edit事件
步骤说明
我们可以通过分组计算锁定时间 + 时间筛选的方式实现需求,用Pandas可按以下步骤操作:
- 转换时间格式:将
timestamp列转为datetime类型,确保能进行时间比较 - 分组提取锁定时间:按
record分组,获取每个记录第一次出现Locked事件的时间 - 筛选目标事件:对每条数据,判断其时间是否晚于对应记录的锁定时间,且事件为
Edit - 标记符合条件的行
代码实现
import pandas as pd # 构造示例数据 data = { 'id': [1,2,3,4,5,6,7,8,9,10], 'timestamp': ['2023-03-01 13:17:05', '2023-03-02 02:57:49', '2023-03-03 00:41:13', '2023-03-03 14:54:34', '2023-03-04 07:29:55', '2023-03-05 02:15:10', '2023-03-05 04:47:33', '2023-03-05 15:39:04', '2023-03-06 08:36:22', '2023-03-06 18:37:28'], 'record': ['record03', 'record02', 'record03', 'record03', 'record03', 'record02', 'record01', 'record02', 'record03', 'record02'], 'event': ['Edit', 'Edit', 'Locked', 'View', 'Edit', 'Locked', 'View', 'View', 'View', 'View'] } df = pd.DataFrame(data) # 1. 转换时间列 df['timestamp'] = pd.to_datetime(df['timestamp']) # 2. 计算每个record的首次Locked时间 lock_times = df[df['event'] == 'Locked'].groupby('record')['timestamp'].first() # 3. 合并锁定时间到原表 df = df.merge(lock_times.rename('lock_time'), on='record', how='left') # 4. 筛选并标记符合条件的行 df['is_violation'] = df.apply( lambda row: True if pd.notna(row['lock_time']) and row['timestamp'] > row['lock_time'] and row['event'] == 'Edit' else False, axis=1 ) # 查看结果 print(df[df['is_violation']])
结果解释
运行上述代码后,会输出符合条件的行(即示例中的第5行):
id timestamp record event lock_time is_violation 4 5 2023-03-04 07:29:55 record03 Edit 2023-03-03 00:41:13 True
关键逻辑说明
groupby('record')['timestamp'].first():只取每个记录第一次锁定的时间,因为如果有多次锁定,我们只关心第一次锁定后的编辑事件merge操作:把每个记录的锁定时间匹配到对应的行,方便后续逐行判断apply函数:逐行检查三个条件:存在锁定时间、当前时间晚于锁定时间、事件是Edit,同时满足则标记为违规
内容的提问来源于stack exchange,提问作者mrgou
相关产品推荐
相关产品推荐

