Медленный pd.to_datetime()

Я читаю два типа CSV-файлов, которые очень похожи. Они примерно одинаковой длины, 20 000 строк. Каждая строка представляет параметры, записываемые каждую секунду. Таким образом, первый столбец — это метка времени.

  • В первом файле шаблон следующий: 2018-09-24 15:38
  • Во втором файле шаблон следующий: 2018-09-24 15:38:06

В обоих случаях команда одинакова:

data = pd.read_csv(file)
data['Timestamp'] = pd.to_datetime(data['Timestamp'])

Я проверяю время выполнения для обеих строк:

  • pd.read одинаково эффективен в обоих случаях
  • для выполнения второй строки кода требуется от 3 до 4 секунд.

Единственная разница - это шаблон даты. Я бы и не подозревал. Ты знаешь почему? Вы знаете, как это исправить?


person Maxime    schedule 24.09.2018    source источник
comment
Используйте параметр format pd.to_datetime, чтобы запретить Pandas пытаться угадать, в какой строке формата находится ваш ввод. Это значительно улучшит производительность to_datetime.   -  person Scott Boston    schedule 24.09.2018


Ответы (1)


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
comment
Отличный ответ. +1 - person Scott Boston; 24.09.2018
comment
В зависимости от формата вместо этого вы можете использовать infer_datetime_format=True, что имеет почти такой же эффект. - person jpp; 24.09.2018