计算两行之间时间差的最佳方法

时间:2019-06-06 08:20:46

标签: python pandas time

场景

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

  • 时间戳
  • 服务
  • 命令
  • Message_type
  • 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进行分组,并添加具有某些计算时间差的功能的附加列。

我的实际问题

  • 我的最初计划好吗?我正在尝试使代码尽可能干净和快速

谢谢。

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

code之后是另一篇文章:

import time

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

您可以自己测量时间。

尝试您的方法和lambda进行测试。

答案 2 :(得分:1)

如果您使用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)

我也认为这是一个好计划=

答案 3 :(得分:1)

如果性能很重要,请避免聚合和分组,因为用MultiIndex创建ResponseResponse系列并减掉Timestamp s会很慢,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