计算组之间的时间增量

时间:2019-05-12 16:13:14

标签: python pandas timedelta

我想计算数据中各组之间的时间增量。

我的数据框有两个分组变量列,然后有一个时间码列。

id      g1      timecode                g2          lot         
...
6753    AX8     2018-12-11 21:06:00     A911928     1153
6754    AX8     2018-12-12 06:55:00     A912152     1154
6755    AX8     2018-12-12 16:35:00     A912152     1154
6756    AX8     2018-12-13 07:10:00     A912159     1155
6757    AX8     2018-12-13 12:28:00     A911404     1156
6758    AX8     2018-12-14 06:11:00     A911927     1157
6759    AX8     2018-12-15 20:00:00     A911928     1158
6760    AX8     2018-12-16 09:59:00     A911928     1158
6761    AX8     2018-12-17 01:20:00     A911914     1159
6762    AX8     2018-12-18 20:00:00     A911928     1160
6763    AX8     2018-12-19 09:59:00     A911928     1160
...

数据按g1顺序排序,然后在该组内按时间码排序。

如果连续行中的g1和g2相同,则我为它们生成了相同的批号。这仅供参考,可能不需要。

现在我想拥有的是所有g2组的timedelta。所以基本上以g2项A911928为例:

...
6753    AX8     2018-12-11 21:06:00     A911928     1153
...

6759    AX8     2018-12-15 20:00:00     A911928     1158
6760    AX8     2018-12-16 09:59:00     A911928     1158
...
6762    AX8     2018-12-18 20:00:00     A911928     1160
6763    AX8     2018-12-19 09:59:00     A911928     1160
...

我想为数据帧生成一个新列(df [“ diff”]),以便每个组都具有到下一个组的时间间隔,以便该组中的最后一行将获得该值。否则,它将仅输入np.nan。就以上示例而言:

  • 第6753行将获得(2018-12-15 20:00:00)-(2018-12-11 21:06:00)
  • 第6759行将获得np.nan
  • 第6760行将获得(2018-12-18 20:00:00)-(2018-12-16 09:59:00)
  • 第6762行将获得np.nan
  • 第6763行将获得下一个时间间隔(如果有的话,否则为np.nan)

我尝试了不同的groupbys和diff()函数,但似乎无法完全达到我的目标。

最有希望的尝试可能是在代码下面,但是我完全不能跨过桥梁来计算增量并保持正确的顺序,然后将差异返回到原始数据帧。

df.groupby(["g1", "g2", "lot"]).agg({"timecode": ["min", "max"]})

                                    timecode
g1  g2      lot             min                     max
...
AX8     A911404     1156.0  2018-12-13 12:28:00     2018-12-13 12:28:00
        A911927     1157.0  2018-12-14 06:11:00     2018-12-14 06:11:00
        ...
        A911928     1153.0  2018-04-25 05:57:00     2018-04-25 05:57:00
                    1158.0  2018-12-15 20:00:00     2018-12-16 09:59:00
                    1160.0  2018-12-18 20:00:00     2018-12-19 09:59:00
...

我也使用过iterrows()解决方案,但是至少我的代码在数据处理方面似乎很慢。

1 个答案:

答案 0 :(得分:0)

此后,我感到自己很愚蠢,我想得太复杂了。我最后要做的是,我仅按“ g2”和“时间码”进行了排序,然后使用df.apply()进行了逐行检查,如果“批次”发生了变化,则将当前日期和以前的日期用作时间增量。