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