Я читаю два типа файлов csv, которые очень похожи. Они имеют одинаковую длину, 20 000 линий. Каждая строка представляет собой параметры, записанные каждую секунду. Таким образом, первый столбец является меткой времени.
В обоих случаях команда одинакова:
data = pd.read_csv(file)
data['Timestamp'] = pd.to_datetime(data['Timestamp'])
Я проверяю время выполнения для обеих строк:
Единственное отличие - это шаблон даты. Я бы этого не подозревал. Ты знаешь почему? Вы знаете, как это исправить?
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
все еще разглаживает второй формат даты медленнее, но это не так плохо, как раньше.
infer_datetime_format=True
, что оказывает практически одинаковое влияние.
format
pd.to_datetime, чтобы запретить Pandas пытаться угадать, в какой строке формата вы вводите данные. Это значительно улучшит производительность to_datetime.