为事件记录分配时间间隔 - 在 pandas 数据框中

Assigning time intervals for event records - in a pandas dataframe

我对 Python 和数据科学还很陌生。我有一个数据集,我将其导入数据框格式,其中每一行都是一个事件或 activity,记录为信息系统日志的一部分。

这是一个简化的例子:

行# 姓名 状态 类型 时间戳
1 order_created 完成 事件 2021 年 1 月 1 日 17:34:00
2 process_order 预定 activity 2021 年 1 月 1 日 17:34:01
3 process_order 开始 activity 2021 年 1 月 1 日 18:35:00
4 process_order 暂停 activity 2021 年 1 月 1 日 18:45:00
5 process_order 已恢复 activity 2021 年 2 月 1 日 08:30:00
6 process_order 完成 activity 2021 年 2 月 1 日 09:05:00
7 order_processed 完成 事件 2021 年 2 月 1 日 09:05:01

在此示例中,'process_order' activity 的总执行时间是以下时间间隔的总和: 第 3-4 行(开始..暂停)+ 第 5-6 行(恢复..完成)= 10 + 35 = 45(分钟):

*这里并不真正需要事件时间戳,但它是数据集的一部分。

为每个activity(数据帧包含超过 200 万行)计算这些执行时间间隔(持续时间)的最有效方法是什么?

谢谢

几个假设:

  • 数据按时间排序
  • 我们只关注4个状态:['started'、'suspended'、'resumed'、'completed']
  • 每 start/resume 之后会有一个停止动作。

这里我使用时间值作为整数来简化事情,但这不会改变结果。我们有一个示例数据框:

df = pd.DataFrame({'state': ['scheduled', 'started','suspended','resumed', 'completed'],
                   'time': [1, 10, 25, 35, 45]
                   })

我们需要创建一个列,其中表示 start/resume 的操作由例如 1 表示,表示 suspend/complete 的操作由 0 表示。其他操作无关紧要,它们可以用-1表示。例如:

def convert(x):
  if x =='started' or x == 'resumed':
    return 1
  elif x== 'suspended' or x == 'completed':
    return 0
  return -1
df['new_state'] = df['state'].apply(lambda x: convert(x))

给出:

state   time    new_state
0   scheduled   1   -1
1   started     10  1
2   suspended   25  0
3   resumed     35  1
4   completed   45  0

我们需要用1的次数减去0的次数:

result = (df[df['new_state'] == 0]['time'] - df[df['new_state'] == 1]['time'].values).sum()

这将给出预期的结果。