Cardinality của chuỗi ngày giờ không lớn. Ví dụ: số chuỗi thời gian theo định dạng %H-%M-%S
là 24 * 60 * 60 = 86400
. Nếu số hàng của tập dữ liệu của bạn lớn hơn nhiều so với dữ liệu này hoặc dữ liệu của bạn chứa nhiều dấu thời gian trùng lặp, việc thêm bộ nhớ cache vào quá trình phân tích cú pháp có thể tăng tốc đáng kể.
Đối với những người không có Cython sẵn, đây là một giải pháp thay thế trong python tinh khiết:
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')
Với bộ dữ liệu cụ thể sau, tăng tốc là 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
Trong 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
Để giới hạn mức sử dụng bộ nhớ, chỉ cần thay thế bộ nhớ cache dict bằng someth ing như một LRU.
Vì vậy, hàm read_csv đáp ứng nhu cầu phân tích cú pháp của bạn nhưng quá chậm? – BKay
Vâng, về cơ bản. Nếu không có giải pháp dễ dàng, tôi muốn xem liệu ai đó có thể đưa ra hướng dẫn để xử lý điều này trong cython hay không. –
Điều này làm tôi bối rối rằng 'pd.Timestamp' không hoạt động (ví dụ:' pd.Timestamp ('05 /31/2012,15:30:00.029 ') '). Thực tế nó không phải là rất có thể là một lỗi. –