Преобразование строки в дату и время - проблемы с производительностью - PullRequest
1 голос
/ 21 февраля 2020

В настоящее время я работаю с большими файлами, каждый файл содержит 65 миллионов строк (размер около 2,5 ГБ), и мне нужно преобразовать один из столбцов в DateTime (формат даты 2019-12-03 08:04:00.200)

Я попробовал 3 способа сделать это.

  1. чтение файла как фрейма данных и затем использование pd.to_datetime ()
  2. чтение файла как фрейма данных - затем с помощью .apply(lambda x : datetime.strptime(x,'%d/%m/%Y %H:%M:%S.%f')
  3. преобразование столбца с использованием анализатора даты при чтении файла в виде фрейма данных

3-й вариант - самый быстрый (затем второй и, наконец, первый). но все они занимают более 25 минут на файл.

Есть ли более быстрый вариант?

1 Ответ

0 голосов
/ 21 февраля 2020

Я предлагаю вам использовать флешку с pd.to_datetime.

Я попробовал все обычные способы сделать что-то быстрое, например numpy или numba, но это не быстрее.

Скоростные тесты

Сначала создадим данные для его проверки:

import pandas as pd
import numpy as np
from datetime import datetime

size = 100_000

data = {
    "year": np.random.choice([str(x) for x in range(2000, 2020)], size),
    "month": np.random.choice([str(x).zfill(2) for x in range(1, 12)], size),
    "day": np.random.choice([str(x).zfill(2) for x in range(1, 28)], size),
    "hour": np.random.choice([str(x).zfill(2) for x in range(24)], size),
    "minute": np.random.choice([str(x).zfill(2) for x in range(60)], size),
    "second": np.random.choice([str(x).zfill(2) for x in range(60)], size),
    "cent": np.random.choice([str(x).zfill(2) for x in range(100)], size),
}

df = pd.DataFrame(data.values(), index=data.keys()).T

А затем столбец date:

df["date"] = (
    df["year"] + "-" +
    df["month"] + "-" +
    df["day"] + " " +
    df["hour"] + ":" +
    df["minute"] + ":" +
    df["second"] + "." +
    df["cent"]
)

И для теста numba:

from numba import jit

@jit
def cast_numba(x):
    return x.astype(np.datetime64)

Теперь мы можем проверить их все:

%timeit pd.to_datetime(df["date"])
1.07 s ± 71 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df["date"].values.astype(np.datetime64)
2.04 s ± 73.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit cast_numba(df["date"].values)
2.24 s ± 394 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df["date"].apply(lambda x : datetime.strptime(x,'%Y-%m-%d %H:%M:%S.%f'))
23 s ± 1.38 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
...