Я предлагаю вам использовать флешку с 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)