【问题标题】:Assigning time intervals for event records - in a pandas dataframe为事件记录分配时间间隔 - 在 pandas 数据框中
【发布时间】:2021-08-14 10:55:32
【问题描述】:

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

  • 事件由单个记录表示,因此具有单个时间戳(瞬时)。
  • 活动由多个记录(和时间戳)表示,并且还具有“状态”属性(已安排、已开始、已暂停、已恢复、已完成、已取消) - 活动持续时间是从开始到完成/取消时测量的实际工作,忽略计划和空闲时间)

这是一个简化的例子:

row # name state type timestamp
1 order_created complete event 01/01/2021 17:34:00
2 process_order scheduled activity 01/01/2021 17:34:01
3 process_order started activity 01/01/2021 18:35:00
4 process_order suspended activity 01/01/2021 18:45:00
5 process_order resumed activity 02/01/2021 08:30:00
6 process_order completed activity 02/01/2021 09:05:00
7 order_processed completed event 02/01/2021 09:05:01

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

*事件 timstamp 在这里并不是真正需要的,但它们是数据集的一部分。

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

谢谢

【问题讨论】:

  • 活动步骤总是这些吗?总是按这个顺序?是否保证在暂停之前不会发生简历?在您的 2M 行数据集中,是否有标识符来对订单进行分组?
  • 这是典型的活动步骤顺序,虽然这是一个真实的数据集,但存在一些差异。活动可以在暂停后恢复(这在我的示例中显示)。是的,有订单标识符,但并非所有活动都必须与订单相关。

标签: python pandas data-science


【解决方案1】:

几个假设:

  • 数据按时间排序
  • 我们只关心 4 个状态:['started', 'suspended', 'resumed', 'completed']
  • 每次启动/恢复后都会有一个停止动作。

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

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

我们需要创建一个列,其中表示开始/恢复的操作用 for 例如 1 表示,表示暂停/完成的操作用 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()

这将给出预期的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2014-07-17
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多