pandas.to_datetime
работает очень медленно (в некоторых случаях), когда ему нужно автоматически анализировать даты. Так как кажется, что вы знаете форматы, вы должны явно передать их в параметр format
, что значительно улучшит скорость.
Вот пример:
import pandas as pd
df1 = pd.DataFrame({'Timestamp': ['2018-09-24 15:38:06']*10**5})
df2 = pd.DataFrame({'Timestamp': ['2018-09-24 03:38:06 PM']*10**5})
%timeit pd.to_datetime(df1.Timestamp)
#21 ms ± 50.4 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit pd.to_datetime(df2.Timestamp)
#14.3 s ± 122 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Это в 700 раз медленнее. Теперь укажите формат явно:
%timeit pd.to_datetime(df2.Timestamp, format='%Y-%m-%d %I:%M:%S %p')
#384 ms ± 1.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
pandas
по-прежнему медленнее разбирает второй формат даты, но уже не так плохо, как раньше.
Редактировать: с pd.__version__ == '1.0.5'
автоматический синтаксический анализ, похоже, стал намного лучше для форматов, которые раньше были чрезвычайно медленно анализируемыми, вероятно, из-за реализации это улучшение производительности в pd.__version == '0.25.0'
import pandas as pd
df1 = pd.DataFrame({'Timestamp': ['2018-09-24 15:38:06']*10**5})
df2 = pd.DataFrame({'Timestamp': ['2018-09-24 03:38:06 PM']*10**5})
%timeit pd.to_datetime(df1.Timestamp)
#9.01 ms ± 294 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit pd.to_datetime(df2.Timestamp)
#9.1 ms ± 267 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
person
ALollz
schedule
24.09.2018
format
pd.to_datetime, чтобы запретить Pandas пытаться угадать, в какой строке формата находится ваш ввод. Это значительно улучшит производительность to_datetime. - person Scott Boston   schedule 24.09.2018