Вычисление разницы во времени в часах между двумя разными строками для каждого горупа с «запаздыванием» в одном столбце

#python #pandas

Вопрос:

У меня есть набор данных, похожий на этот.

 df = pd.DataFrame({'CODE':["PNR1", "PNR1", "PNR1", "PNR1","PNR2","PNR2","PNR3" ],  'FROM': ["RDM", "DEN", "FLL", "IAH", "AEP", "COR", "DEL"],  'TO' : [ "DEN", "FLL", "IAH","SFO", "COR", "AEP", "BOM"],  'DEPART':["13-07-2021 13:00:00","13-07-2021 17:50:00","15-07-2021 17:15:00","15-07-2021 19:40:00", "22-09-2021 09:05:00", "22-09-2021 17:05:00", "22-09-2021 06:05:00"],  'ARRIVAL':["13-07-2021 16:26:00","13-07-2021 23:39:00","15-07-2021 18:52:00", "15-07-2021 21:27:00","22-09-2021 10:30:00","22-09-2021 18:20:00","22-09-2021 08:05:00"]}) df['NUMSTOPS'] = df.groupby('CODE')['CODE'].transform('count') df['DEPART'] = pd.to_datetime(df['DEPART'], format='%d-%m-%Y %H:%M:%S') df['ARRIVAL'] = pd.to_datetime(df['ARRIVAL'], format='%d-%m-%Y %H:%M:%S')  

Я хочу найти разницу во времени для каждой группы, чтобы узнать разницу во времени «ОТПРАВЛЕНИЯ» от предыдущего прибытия и показать ее в часах. Я применил следующее:

 df['LAYOVER']=df.groupby('CODE').apply(lambda x:x['DEPART']- x['ARRIVAL']).shift(1).fillna('0').reset_index(drop=True)  

Но это дает мне следующий результат:

 CODE FROM TO DEPART ARRIVAL NUMSTOPS LAYOVER 0 PNR1 RDM DEN 2021-07-13 13:00:00 2021-07-13 16:26:00 4 00:00:00 1 PNR1 DEN FLL 2021-07-13 17:50:00 2021-07-13 23:39:00 4 -1 days  20:34:00 2 PNR1 FLL IAH 2021-07-15 17:15:00 2021-07-15 18:52:00 4 -1 days  18:11:00 3 PNR1 IAH SFO 2021-07-15 19:40:00 2021-07-15 21:27:00 4 -1 days  22:23:00 4 PNR2 AEP COR 2021-09-22 09:05:00 2021-09-22 10:30:00 2 -1 days  22:13:00 5 PNR2 COR AEP 2021-09-22 17:05:00 2021-09-22 18:20:00 2 -1 days  22:35:00 6 PNR3 DEL BOM 2021-09-22 06:05:00 2021-09-22 08:05:00 1 -1 days  22:45:00  

Я не понимаю, что я делаю не так и как продолжить расчет времени вылета и предыдущего прибытия для каждой группы.

Ожидаемый результат:

Ожидаемый Результат

Комментарии:

1. Какого результата вы ожидаете? Можете ли вы опубликовать образец фрейма данных, содержащий нужные вам данные?

2. Я добавил снимок ожидаемого результата. Для каждой группы я хочу найти разницу между «ОТПРАВЛЕНИЕМ» и «ПРИБЫТИЕМ». Значения «NA» должны быть присвоены «Нулю».

Ответ №1:

У вас скобки не на месте. .shift() был за пределами вашей скобки. исправлено здесь.

 df['LAYOVER']=df.groupby('CODE').apply(lambda x:x['DEPART']- x['ARRIVAL'].shift(1)).fillna('0').reset_index(drop=True) df['LAYOVER'].apply(lambda x: pd.Timedelta(x).seconds)  0 0 1 5040 2 63360 3 2880 4 0 5 23700 6 0 Name: LAYOVER, dtype: int64  

это более лаконично:

 df.groupby('CODE').apply(lambda x:x['DEPART']- x['ARRIVAL'].shift(1)).fillna('0').reset_index(drop=True).dt.seconds  

Комментарии:

1. ЗАДЕРЖКА для строки «2» составляет 63360 секунд, однако в соответствии с расчетами значение должно составлять 149760 секунд. Не могли бы вы, пожалуйста, подтвердить?

2. Я исправил это с помощью команды dt.total_seconds ().