分组并计算时间戳的差异

Posted

技术标签:

【中文标题】分组并计算时间戳的差异【英文标题】:Group by and calculate difference in timestamp 【发布时间】:2019-07-21 22:28:10 【问题描述】:

我有一个看起来像这样的数据集

I.D       Timestamp
F322      2019-02-20 23:47:30.057
F322      2019-02-20 23:48:01.959 
F322      2019-02-20 23:50:04.308   
F422      2019-02-24 22:22:37.418
F422      2019-02-24 22:24:05.397

我正在尝试创建一个新列,将每个升序(已排序)时间戳的差异减去它之前的前一个时间戳,但按 I.D 列分组。一些 I.D 有 2、3 或 4 个时间戳。

输出看起来像这样

I.D       Timestamp                   Minutes
F322      2019-02-20 23:47:30.057         NaN
F322      2019-02-20 23:48:01.959         0.5
F322      2019-02-20 23:50:04.308         2.0
F422      2019-02-24 22:22:37.418         NaN
F422      2019-02-24 22:24:05.397         1.5

我过去曾用过一些东西,例如下面的一些不同的东西

df.groupby('I.D')['Timestamp'].agg(lambda x: x.iat[0] < x.iat[-1])

np.where(df['I.D'].map(mask), 1, 2)

产生 1 或 2 的值,但这仅适用于按 I.D 分组的 a 的第一行和第二行,并且只产生一个值而不是计算。

感谢收看!

【问题讨论】:

什么是 0.9...? 抱歉,这只是该行时间戳和之前的行之间的分钟差 我认为这是一个误判!应该是我的答案中的 0.516667? 正确!对不起! 【参考方案1】:

你可以使用 groupby 和 diff:

In [11]: res = df.groupby("I.D").Timestamp.diff()

In [12]: res
Out[12]:
0               NaT
1   00:00:31.902000
2   00:02:02.349000
3               NaT
4   00:01:27.979000
Name: Timestamp, dtype: timedelta64[ns]

然后将秒除以 60 得到分钟:

In [13]: res.dt.seconds / 60
Out[13]:
0         NaN
1    0.516667
2    2.033333
3         NaN
4    1.450000
Name: Timestamp, dtype: float64

【讨论】:

谢谢!快速提问 - 如果我想创建另一列 - 对每个分组的 i.ds 时间戳(不是你刚才帮我计算的分钟数)进行排名,我该怎么做?所以每个 i.d 都会有一个与时间戳列相关的按升序排列 1、2、3、4 的列? @Chris90 你在找df.groupby("I.D").cumcount() 我想,但是如果有什么不同,请提出一个新问题:)

以上是关于分组并计算时间戳的差异的主要内容,如果未能解决你的问题,请参考以下文章

带有 UNIX 时间戳的 MySQL 表 - 按时间戳排序并计算一行与前一行之间的差异

在 SQL 中按组中的行计算时间差异

使用chrono c++库计算时间戳的差异

计算同一张表中SQL中两个时间戳的差值

计算同一列之间的差异,在python中由另一列分组的连续行

如何在 Grafana 中查找内存使用差异