Ваша логика слишком сложна.Рядовые петли, которые представляют собой pd.DataFrame.apply
, следует активно избегать с пандами.Здесь вы можете преобразовать серию timedelta
в секунды, а затем принять абсолютное значение:
df = pd.DataFrame({'a_time': pd.to_datetime(['2018-01-01 05:32:00', '2018-05-10 20:13:41']),
'b_time': pd.to_datetime(['2018-01-01 15:10:05', '2018-05-10 16:09:16'])})
df['C'] = (df['b_time'] - df['a_time']).dt.total_seconds().abs() / 60
print(df)
a_time b_time C
0 2018-01-01 05:32:00 2018-01-01 15:10:05 578.083333
1 2018-05-10 20:13:41 2018-05-10 16:09:16 244.416667
. Для академических целей вы можете использовать apply
:
def time_delta(row):
if row['a_time'] > row['b_time']:
return (row['a_time'] - row['b_time']) / np.timedelta64(1, 'm')
else:
return (row['b_time'] - row['a_time']) / np.timedelta64(1, 'm')
df['C'] = df.apply(time_delta, axis=1)
Обратите внимание, что в обеих версиях мы предполагаем, что вы начинаете с серии datetime
.Если это не так, убедитесь, что вы преобразовали в datetime
в качестве начального шага:
time_cols = ['a_time', 'b_time']
df[time_cols] = df[time_cols].apply(pd.to_datetime)