计算数据框中记录之间的增量时间

Posted

技术标签:

【中文标题】计算数据框中记录之间的增量时间【英文标题】:calculating delta time between records in dataframe 【发布时间】:2016-10-03 07:47:05 【问题描述】:

我有一个有趣的问题,我正在尝试计算在不同位置完成的记录之间的增量时间。

id x y time
1  x1 y1 10
1  x1 y1 12
1  x2 y2 14
2  x4 y4 8
2  x5 y5 12

我正在尝试获得类似的东西

id x y time delta
1 x1 y1 10   4
1 x2 y2 14   0
2 x4 y4 8    4
2 x5 y5 12   0

我已经通过使用自定义 UDTF 使用 HiveQL 完成了这种类型的处理,但我正在考虑如何使用 DataFrame 来实现这一点(可能是在 R、Pandas、PySpark 中)。理想情况下,我正在尝试为 Python pandas 和 pyspark 找到解决方案。

感谢您的任何提示,感谢您的宝贵时间!

【问题讨论】:

为什么输出中缺少行1 x1 y1 12 您需要df.groupby(['id'])['time'].diff() 吗? 嗨 @jezrael 第 1 行丢失,因为此记录的完成位置与第 0 行相同,我试图在不同位置找到增量时间。只有在删除在每个位置完成的多条记录后,我才能进行分组。我总是想保留在某个位置制作的第一条记录。 嗯,我认为这是一个有点问题的答案,因为实际上可以有更多的行,但是你需要df = df.drop_duplicates(subset=['id','x','y']) 然后df['delta'] = df.groupby(['id'])['time'].diff().shift(-1).fillna(0) 吗? 嗨@jezrael 谢谢你的提示,它非常有用,这里是代码import pandas as pd df = pd.read_csv("sampleInput.txt", header=None,usecols=[0,1,2,3], names=['id','x','y','time'],sep="\t") delta = df.groupby(['id','x','y']).first().reset_index() delta['delta'] = delta.groupby('id')['time'].diff().shift(-1).fillna(0) 【参考方案1】:

我认为你需要drop_duplicatesgroupbyDataFrameGroupBy.diffshiftfillna

df1 = df.drop_duplicates(subset=['id','x','y']).copy()

df1['delta'] = df1.groupby(['id'])['time'].diff().shift(-1).fillna(0)

最终代码:

import pandas as pd df = pd.read_csv("sampleInput.txt", 
                                      header=None,
                                      usecols=[0,1,2,3], 
                                      names=['id','x','y','time'],
                                      sep="\t") 

delta = df.groupby(['id','x','y']).first().reset_index() 
delta['delta'] = delta.groupby('id')['time'].diff().shift(-1).fillna(0)

时间安排

In [111]: %timeit df.groupby(['id','x','y']).first().reset_index()
100 loops, best of 3: 2.42 ms per loop

In [112]: %timeit df.drop_duplicates(subset=['id','x','y']).copy()
1000 loops, best of 3: 658 µs per loop

【讨论】:

我认为更快的是使用drop_duplicates,如果需要创建新的DataFrame,我添加copy 如果我的回答有帮助,别忘了accept。谢谢。 谢谢,是的,它看起来更快,在我遇到之前,这段代码对无序时间字段很敏感,关于在分组对象中排序的任何想法(w.r.t time)?然后在已排序的分组项目上调用 diff()。无论如何,我必须在删除重复项后使用 groupby id。 是的,您可以使用sort_values - df = df.sort_values(by='id') 在数据帧上,是的 sort_values 是这种方式,但有趣的是,它不适用于 groupedDataFrame 对象【参考方案2】:

@jezrael 谢谢你的提示,非常有用,这里是代码

import pandas as pd
df = pd.read_csv("sampleInput.txt", header=None,usecols=[0,1,2,3], names=['id','x','y','time'],sep="\t")
delta = df.groupby(['id','x','y']).first().reset_index()
delta['delta'] = delta.groupby('id')['time'].diff().shift(-1).fillna(0)

这需要

1   x1  y1  10
1   x1  y1  12
1   x2  y2  14
2   x4  y4  8
2   x5  y5  12

并给予,

   id   x   y  time  delta
0   1  x1  y1    10      4
1   1  x2  y2    14      0
2   2  x4  y4     8      4
3   2  x5  y5    12      0

【讨论】:

以上是关于计算数据框中记录之间的增量时间的主要内容,如果未能解决你的问题,请参考以下文章

如何计算熊猫数据框中组的每对行之间的函数

从没有时间戳列的数据库表中增量获取两个日期之间的记录

如何检查我的数据框中的每个记录大小

如何计算数据框中的唯一行?

如何根据记录中其他 4 个字段的布尔运算符有效地更新数据框中的字段?

更新 hive 表中的增量记录