为事件记录分配时间间隔 - 在 pandas 数据框中
Assigning time intervals for event records - in a pandas dataframe
我对 Python 和数据科学还很陌生。我有一个数据集,我将其导入数据框格式,其中每一行都是一个事件或 activity,记录为信息系统日志的一部分。
- 事件由单个记录表示,因此具有单个时间戳(瞬时)。
- 活动由多个记录(和时间戳)表示,并且还有一个 'state' 属性(计划、开始、暂停、恢复、完成、取消)- activity 持续时间是从在实际工作时开始 completion/cancellation,忽略计划和空闲时间)
这是一个简化的例子:
行#
姓名
状态
类型
时间戳
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()
这将给出预期的结果。
我对 Python 和数据科学还很陌生。我有一个数据集,我将其导入数据框格式,其中每一行都是一个事件或 activity,记录为信息系统日志的一部分。
- 事件由单个记录表示,因此具有单个时间戳(瞬时)。
- 活动由多个记录(和时间戳)表示,并且还有一个 'state' 属性(计划、开始、暂停、恢复、完成、取消)- activity 持续时间是从在实际工作时开始 completion/cancellation,忽略计划和空闲时间)
这是一个简化的例子:
行# | 姓名 | 状态 | 类型 | 时间戳 |
---|---|---|---|---|
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()
这将给出预期的结果。