Python 计算两行之间时间差的最佳方法
场景 我有一个具有给定结构的数据帧,最后总结一下,我想找出服务的响应和请求之间的时间差。 它有以下列:Python 计算两行之间时间差的最佳方法,python,pandas,time,Python,Pandas,Time,场景 我有一个具有给定结构的数据帧,最后总结一下,我想找出服务的响应和请求之间的时间差。 它有以下列: 时间戳 服务 命令 消息类型 消息ID 数据的一个例子是: Timestamp Service Command Message_Type Message_ID 12:00:00 FoodOrders SeeStock() Request 125 12:00:02 FoodOrders SeeStock() Response
- 时间戳
- 服务
- 命令
- 消息类型
- 消息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
我想做什么
按服务、命令、消息\u ID分组,并添加一个附加列,其中包含一些计算时间差的函数
我的实际问题
- 我最初的计划好吗?我希望尽量使代码尽可能干净和快速
谢谢。这个计划多少还可以。请注意,为了提高效率,最好不要直接传递lambda函数来计算自定义聚合,如TimeDiff。最好先计算可以使用pandas/numpy内置程序完成的辅助聚合,然后根据这些计算自定义聚合。该计划大致正常。请注意,为了提高效率,最好不要直接传递lambda函数来计算自定义聚合,如TimeDiff。最好先计算pandas/numpy内置的辅助聚合,然后根据这些计算自定义聚合。接着是另一篇文章:
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
你可以自己测量时间
尝试oyur方法和lambda来测试它。然后是另一篇文章:
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
你可以自己测量时间
试试你的方法和lambda来测试它。如果你使用jupiter笔记本,你可以尝试以下方法:
%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)
我还认为这是一个很好的计划=)如果你使用jupiter笔记本,你可以尝试以下方式:
%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)
我还认为这是一个很好的计划=)如果性能很重要,避免聚合和分组,因为慢,更好的方法是创建
响应
和响应
序列,使用多索引和减去时间戳
s,排序索引
也有助于提高性能:
#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
如果性能很重要,请避免聚合和分组,因为使用多索引和减法时间戳创建
响应
和响应
序列更慢、更好,排序索引
也有助于提高性能:
#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
当我看到这个问题时,我想到了同样的解决办法。所以这可能是一个好主意,当我研究这个问题时,我想到了同样的解决方案。所以这可能是一个好主意。嘿,我最终选择了这种方法,它似乎是一种魅力。谢谢我现在的问题是,若你们能,解释一下台词。基于这些COL设置索引真正意味着什么?然后按它们的索引排序,这意味着当进行减法运算时,它的顺序应该是相同的?例如,对于某条消息,我只是得到了响应,而不是请求,这会是健壮的吗?@AlejandroA-ya,当然。这里之所以需要多索引,是因为一个重要原因——如果有多行数据需要在
'Service'、'Command'、'Message\u ID'
值之间进行正确匹配——因此,这意味着只有具有相同多索引三元组的值才能从另一系列的三元组中减去'Service'、'Command'、'Message\u ID'
。这叫做对齐。嘿,我最终选择了这种方法,它似乎是一种魅力。谢谢我现在的问题是,若你们能,解释一下台词。基于这些COL设置索引真正意味着什么?然后按它们的索引排序,这意味着当进行减法运算时,它的顺序应该是相同的?例如,对于某条消息,我只是得到了响应,而不是请求,这会是健壮的吗?@AlejandroA-ya,当然。这里之所以需要多索引,是因为一个重要原因——如果有多行数据需要在'Service'、'Command'、'Message\u ID'
值之间进行正确匹配——因此,这意味着只有具有相同多索引三元组的值才能从另一系列的三元组中减去'Service'、'Command'、'Message\u ID'
。这叫做对齐。