【问题标题】:Best approach to calculate time difference between two rows计算两行之间时间差的最佳方法
【发布时间】:2019-06-06 08:20:46
【问题描述】:

场景

我有一个具有给定结构的数据框,最后总结一下,我想找到服务的响应和请求之间的时间差。 它有以下列:

  • 时间戳
  • 服务
  • 命令
  • 消息类型
  • Message_ID

数据的一个例子是:

Timestamp   Service      Command     Message_Type   Message_ID
12:00:00    FoodOrders  SeeStock()  Request        125
12:00:02    FoodOrders  SeeStock()  Response       125

输出必须类似于

Service   Command   Message_ID  TimeDiff
FoodOrders  SeeStock  125       00:00:02

我想过做什么

按 Service、Command、Message_ID 分组,并添加一个附加列,其中包含一些计算时间差的函数。

我的实际问题

  • 我的初始计划好吗?我希望尝试使代码尽可能干净和快速

谢谢。

【问题讨论】:

  • 看问题的时候想到了同样的解决办法。所以这可能是一个好主意。

标签: python pandas time


【解决方案1】:

如果性能很重要,请避免聚合和 groupby,因为速度慢,更好的是使用 MultiIndex 创建 ResponseResponse 系列并减去 Timestamps,sort_index 也应该有助于提高性能:

#if necessary
#df['Timestamp'] = pd.to_timedelta(df['Timestamp'])

cols = ['Service','Command','Message_ID']
s1 = df[df['Message_Type'] == 'Response'].set_index(cols)['Timestamp'].sort_index()
s2 = df[df['Message_Type'] == 'Request'].set_index(cols)['Timestamp'].sort_index()

df1 = s1.sub(s2).reset_index()
print (df1)
      Service     Command  Message_ID Timestamp
0  FoodOrders  SeeStock()         125  00:00:02

【讨论】:

  • 嘿,我终于采用了这种方法,它似乎很有魅力。谢谢。我现在的问题是,如果可以的话,请解释一下这些台词。根据这些列设置索引的真正含义是什么?然后按他们的索引排序,意味着在做减法时它希望是相同的顺序?例如,如果对于某些消息,我只有一个响应,而不是一个请求,这会是健壮的吗?
  • @AlejandroA - 是的,当然。这里是 MultiIndex 是必要的,因为一个重要原因 - 如果有多个数据行需要在 'Service','Command','Message_ID' 值之间正确匹配 - 所以这意味着只有具有相同 MultiIndex 三元组 'Service','Command','Message_ID' 的值才会从另一个系列中的三元组中减去。这叫做对齐。
【解决方案2】:

该计划或多或少还可以。请注意,为了提高效率,最好不要直接传递 lambda 函数来计算像 TimeDiff 这样的自定义聚合。最好先计算可以使用 pandas / numpy 内置函数完成的辅助聚合,然后根据这些计算自定义聚合。

【讨论】:

    【解决方案3】:

    随后是另一个帖子中的 code

    import time
    
    start = time.time()
    print("hello")
    end = time.time()
    print(end - start)
    

    你可以自己测量时间。

    尝试 oyur 方法和 lambda 来测试它。

    【讨论】:

      【解决方案4】:

      如果你使用 jupiter notebook,你可以试试这样:

      %timeit df.sort_values('Time').groupby(['Service', 'Command', 'Message_Type', 'Message_ID']).apply(lambda x: x.iloc[1]['Time'] - x.iloc[0]['Time'])
      

      在我的示例中,我有这个:

      2.97 ms ± 310 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
      

      而且我也认为这是一个很好的计划=)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-23
        • 2014-09-21
        • 2019-01-11
        • 2017-02-14
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        相关资源
        最近更新 更多