Liczebność łańcuchów datetime nie jest ogromna. Na przykład liczba łańcuchów czasu w formacie %H-%M-%S
to 24 * 60 * 60 = 86400
. Jeśli liczba wierszy zbioru danych jest znacznie większa niż ta lub dane zawierają dużo duplikatów sygnatur czasowych, dodanie pamięci podręcznej w procesie analizy może znacznie przyspieszyć działanie.
Dla tych, którzy nie mają Cython dostępne, oto rozwiązanie alternatywne w czystym Pythonie:
import numpy as np
import pandas as pd
from datetime import datetime
def parse_datetime(dt_array, cache=None):
if cache is None:
cache = {}
date_time = np.empty(dt_array.shape[0], dtype=object)
for i, (d_str, t_str) in enumerate(dt_array):
try:
year, month, day = cache[d_str]
except KeyError:
year, month, day = [int(item) for item in d_str[:10].split('-')]
cache[d_str] = year, month, day
try:
hour, minute, sec = cache[t_str]
except KeyError:
hour, minute, sec = [int(item) for item in t_str.split(':')]
cache[t_str] = hour, minute, sec
date_time[i] = datetime(year, month, day, hour, minute, sec)
return pd.to_datetime(date_time)
def read_csv(filename, cache=None):
df = pd.read_csv(filename)
df['date_time'] = parse_datetime(df.loc[:, ['date', 'time']].values, cache=cache)
return df.set_index('date_time')
z następującymi określonego zestawu danych, przyspieszenie jest 150x +:
$ ls -lh test.csv
-rw-r--r-- 1 blurrcat blurrcat 1.2M Apr 8 12:06 test.csv
$ head -n 4 data/test.csv
user_id,provider,date,time,steps
5480312b6684e015fc2b12bc,fitbit,2014-11-02 00:00:00,17:47:00,25
5480312b6684e015fc2b12bc,fitbit,2014-11-02 00:00:00,17:09:00,4
5480312b6684e015fc2b12bc,fitbit,2014-11-02 00:00:00,19:10:00,67
W ipython:
In [1]: %timeit pd.read_csv('test.csv', parse_dates=[['date', 'time']])
1 loops, best of 3: 10.3 s per loop
In [2]: %timeit read_csv('test.csv', cache={})
1 loops, best of 3: 62.6 ms per loop
Aby ograniczyć wykorzystanie pamięci, po prostu wymień pamięć podręczną dyktowania na coś jak LRU.
Funkcja read_csv spełnia twoje potrzeby analizy, ale działa zbyt wolno? – BKay
Tak, zasadniczo. Jeśli nie ma łatwego rozwiązania, chciałem sprawdzić, czy ktoś może podać wytyczne dotyczące postępowania w cytoncie. –
Dezorientuje mnie, że 'pd.Timestamp' nie działa (działa indywidualnie np. Przy użyciu' pd.Timestamp ('05 /31/2012,15:30:00.029 ') '). Fakt, że tak nie jest, jest najprawdopodobniej błędem. –