#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 с. Спасибо