Я использовал следующий тест DataFrame (с «истинными» временными метками):
ID Day OtherInfo log_timestamp
0 A 17 foo 2019-09-01 10:20:00
1 A 17 bar 2019-09-01 11:30:00
2 A 18 footoo 2019-09-01 15:10:00
3 A 18 bar_bar 2019-09-01 15:55:00
Начнем с определения функции, вычисляющей 2 значения результата из 2 исходных значений (временных меток):
def fn(grp):
return [grp.iloc[1] - grp.iloc[0], np.nan]
Первое возвращаемое значение является разницей, а второе - NaN .
Используйте его следующим образом:
df['duration'] = df.groupby(np.arange(len(df.index)) // 2)\
.log_timestamp.transform(fn)
Результат:
ID Day OtherInfo log_timestamp duration
0 A 17 foo 2019-09-01 10:20:00 01:10:00
1 A 17 bar 2019-09-01 11:30:00 NaT
2 A 18 footoo 2019-09-01 15:10:00 00:45:00
3 A 18 bar_bar 2019-09-01 15:55:00 NaT
groupby (np.arange (len (df.index)) // 2) - это пандазонская «идиома» для группировки DataFrame (или * 1021)* Series ) на группы по 2 строки (или элементы).
Затем transform (fn) генерирует последовательность значений, что-то вроде «копии» исходной последовательности (пара отметок времени).
Таким образом, первое возвращаемое значение - разница между обеими отметками времени - это новое значение для первого элемента и NaN - для второго.
Поскольку столбец назначения имеет тип Отметка времени , NaN преобразуется в NaT .