【问题标题】: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?
  • 正确!对不起!

标签: python-3.x pandas timestamp pandas-groupby timedelta


【解决方案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() 我想,但是如果有什么不同,请提出一个新问题:)
猜你喜欢
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
相关资源
最近更新 更多