#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 ().