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

1

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

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

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

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

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

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

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

  • 0
    Используйте параметр format pd.to_datetime, чтобы запретить Pandas пытаться угадать, в какой строке формата вы вводите данные. Это значительно улучшит производительность to_datetime.
Теги:
pandas

1 ответ

3
Лучший ответ

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 все еще разглаживает второй формат даты медленнее, но это не так плохо, как раньше.

  • 2
    Отличный ответ. +1
  • 1
    В зависимости от формата, вы можете вместо этого использовать infer_datetime_format=True , что оказывает практически одинаковое влияние.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню