Я хочу рассчитать время в пути каждого пассажира в моем фрейме данных на основе разницы между моментом, когда они впервые садятся в автобус, и моментом, когда они уезжают.
Вот фрейм данных
my_df = pd.DataFrame({
'id': ['a', 'b', 'b', 'b', 'b', 'b', 'c','d'],
'date': ['2020/02/03', '2020/04/05', '2020/04/05', '2020/04/05','2020/04/06', '2020/04/06', '2020/12/15', '2020/06/23'],
'arriving_time': ['14:36:06', '08:52:02', '08:53:02', '08:55:24', '18:58:03', '19:03:05', '17:04:28', '21:31:23'],
'leaving_time': ['14:40:05', '08:52:41', '08:54:33', '08:57:14', '19:01:07', '19:04:08', '17:09:48', '21:50:12']
})
print(my_df)
output:
id date arriving_time leaving_time
0 a 2020/02/03 14:36:06 14:40:05
1 b 2020/04/05 08:52:02 08:52:41
2 b 2020/04/05 08:53:02 08:54:33
3 b 2020/04/05 08:55:24 08:57:14
4 b 2020/04/06 18:58:03 19:01:07
5 b 2020/04/06 19:03:05 19:04:08
6 c 2020/12/15 17:04:28 17:09:48
7 d 2020/06/23 21:31:23 21:50:12
Однако есть две проблемы (которые мне не удается решить самостоятельно):
- пассажиры обнаруживаются через телефонный сигнал, но сигнал часто нестабилен, поэтому для одного и того же человека у нас может быть много строк (например, пассажир b в приведенном выше наборе данных). «прибывающее время» - это время, когда сигнал обнаружен, а «уходящее время» - время, когда сигнал потерян.
- . Чтобы вычислить время в пути, мне необходимо вычесть для каждого уникального идентификатора и для каждого путешествия наименьшее последнее прибытие - самое позднее время вылета.
Вот результат, который я хочу получить
id date arriving_time leaving_time travelTime
0 a 2020/02/03 14:36:06 14:40:05 00:03:59
1 b 2020/04/05 08:52:02 08:52:41 00:05:12
2 b 2020/04/05 08:53:02 08:54:33 00:05:12
3 b 2020/04/05 08:55:24 08:57:14 00:05:12
4 b 2020/04/06 18:58:03 19:01:07 00:06:05
5 b 2020/04/06 19:03:05 19:04:08 00:06:05
6 c 2020/12/15 17:04:28 17:09:48 00:05:20
7 d 2020/06/23 21:31:23 21:50:12 00:18:49
Как видите, пассажир b совершил два разных путешествия в один и тот же день и я хочу знать, вычислить, как долго каждый из них будет длиться.
Я уже пробовал следующий код, который, кажется, работает, но он действительно медленный (что, я думаю, связано с большим количеством строк из my_df)
for user_id in set(my_df.id):
for day in set(my_df.loc[my_df.id == user_id, 'date']):
my_df.loc[(my_df.id == user_id) & (my_df.date == day), 'travelTime'] = max(my_df.loc[(my_df.id == user_id) & (my_df.date == day), 'leaving_time'].apply(pd.to_datetime)) - min(my_df.loc[(my_df.id == user_id) & (my_df.date == day), 'arriving_time'].apply(pd.to_datetime))