首页 > 解决方案 > 计算组之间的时间增量

问题描述

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

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

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”])生成新列,每个组都将具有下一组的 timedelta 间隔,以便该组中的最后一行获得该值。否则它只会输入 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() 解决方案,但至少我的代码对数据似乎很慢。

标签: pythonpandastimedelta

解决方案


现在后来觉得自己很傻,想的太复杂了。我最终做的是我只是按“g2”和“timecode”排序,然后使用 df.apply() 遍历这些行,如果“lot”发生变化,则使用当前和以前的日期作为 timedelta。


推荐阅读