Расчет времени между группами - PullRequest
0 голосов
/ 12 мая 2019

Я хотел бы рассчитать 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. Таким образом, в основном для элемента 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. В терминах приведенного выше примера:

  • строка 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 (), но, по крайней мере, мой код работает с данными довольно медленно.

...