Панды медленно сливаются и преобразуются в дату и время

#python #python-3.x #pandas

#питон #python-3.x #панды

Вопрос:

У меня есть два столбца данных во фрейме данных, содержащих дату и время. Оба начинаются как строки. Я хочу, чтобы они в конечном итоге объединились в один столбец в формате datetime.

Глава фрейма данных является:

 Date variable value 0 '04/10/2020' '00:30' 81.310 1 '05/10/2020' '00:30' 121.245 2 '06/10/2020' '00:30' 77.020 3 '07/10/2020' '00:30' 100.705 4 '08/10/2020' '00:30' 114.370  

Они находятся в вызванном DF df_flattened и имеют около 20 тыс. строк, и код, который я в настоящее время использую,:

 df_flattened['DateTime'] = df_flattened.apply(lambda x: x['Date']   ' '   x['variable'], axis=1) df_flattened['DateTime'] = pd.to_datetime(df_flattened['DateTime'])  

Однако для этого потребуется около 2,6 секунды, и набор данных в будущем станет намного больше. Может ли кто-нибудь предложить быстрый способ сделать это?

Ответ №1:

Вместо этого вы можете использовать для объединения столбцов apply :

 df_flattened['DateTime'] = pd.to_datetime(df_flattened['Date']   ' '   df_flattened['variable'])  

Также можно указать формат объединенных дат:

 df_flattened['DateTime'] = pd.to_datetime(df_flattened['Date']   ' '   df_flattened['variable'], format='%d/%m/%Y %H:%M')  

Производительность для 20 тыс. строк:

 #20k rows df_flattened = pd.concat([df_flattened] * 4000, ignore_index=True)   In [44]: %%timeit  ...: df_flattened['DateTime'] = df_flattened.apply(lambda x: x['Date']   ' '   x['variable'], axis=1)  ...: df_flattened['DateTime'] = pd.to_datetime(df_flattened['DateTime'])  ...:   ...:  325 ms ± 26.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)  In [45]: %timeit df_flattened['DateTime'] = pd.to_datetime(df_flattened['Date']   ' '   df_flattened['variable']) 11.9 ms ± 1.51 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)  In [46]: %timeit df_flattened['DateTime'] = pd.to_datetime(df_flattened['Date']   ' '   df_flattened['variable'], format='%d/%m/%Y %H:%M') 9.55 ms ± 96.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)  

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

1. @GalacticPonderer… Удаление ненужного приложения с axis=1 и использование формата know значительно повысит производительность. 1

2. Это действительно так. Снизил его до 0,9 с. Спасибо