索引/切片似乎比由@NPE使用正則表達式更快:
In [47]: def with_indexing(dstr):
....: return datetime.datetime(*map(int, [dstr[:4], dstr[5:7], dstr[8:10],
....: dstr[11:13], dstr[14:16], dstr[17:]]))
In [48]: p = re.compile('[-T:]')
In [49]: def with_regex(dt_str):
....: return datetime.datetime(*map(int, p.split(dt_str)))
In [50]: %timeit with_regex(dstr)
100000 loops, best of 3: 3.84 us per loop
In [51]: %timeit with_indexing(dstr)
100000 loops, best of 3: 2.98 us per loop
我認爲如果你使用像numpy.genfromtxt
這樣的文件解析器,converters
參數和一個快速的字符串解析方法,你可以在不到半秒的時間內讀取和解析整個文件。
我用下面的函數來創建具有約25000行,ISO日期字符串作爲索引和10個的數據列的一例的文件:
import numpy as np
import pandas as pd
def create_data():
# create dates
dates = pd.date_range('2010-01-01T00:30', '2013-01-04T23:30', freq='H')
# convert to iso
iso_dates = dates.map(lambda x: x.strftime('%Y-%m-%dT%H:%M:%S'))
# create data
data = pd.DataFrame(np.random.random((iso_dates.size, 10)) * 100,
index=iso_dates)
# write to file
data.to_csv('dates.csv', header=False)
比我用下面的代碼來解析文件:
In [54]: %timeit a = np.genfromtxt('dates.csv', delimiter=',',
converters={0:with_regex})
1 loops, best of 3: 430 ms per loop
In [55]: %timeit a = np.genfromtxt('dates.csv', delimiter=',',
converters={0:with_indexing})
1 loops, best of 3: 391 ms per loop
pandas(基於numpy的)已基於C的文件解析器這甚至更快:
In [56]: %timeit df = pd.read_csv('dates.csv', header=None, index_col=0,
parse_dates=True, date_parser=with_indexing)
10 loops, best of 3: 167 ms per loop
你的意思是你認爲解析和轉換25.000日期,包括建立一個相同大小的新列表應該比解釋型語言中的三分之一秒更快?您可能想切換到編譯語言。 –
@TimPietzcker您可以在numpy/pandas的不到三分之一秒內讀取和解析包含超過25000個日期和10個列的文件。 – bmu
這就是我所經歷的...... – HyperCube