2015-06-22 289 views
2

(熊猫0.16.1,2.7.8的Python 2.1.0蟒蛇(64位),英特尔至强3.07GHz,Win7的64位)蟒蛇大熊猫read_csv如何加快处理时间戳

我有一个CSV表报价数据。每天约40万行。

sym   time     bid  ask  bsize asize 
[email protected] 2014.05.07T08:10:02.407 1.3927 1.3928 28 29 
[email protected] 2014.05.07T08:10:02.430 1.3927 1.3928 27 29 

要与熊猫阅读此成Python

pd.read_csv("quotes.csv", parse_dates = {'idx':[1]}, index_col = 'idx') 

约需40秒。

任何想法,如果这可以做得更快?人们提出了Cython解决方案in this post,但我不知道Python/pandas解决方案是否存在?

顺便说一句,这下面不解析日期,一个错误?

pd.read_csv("quotes.csv", parse_dates = [1]) 
+0

我的速度慢了多少t与'parse_dates'?我不认为cython真的会在这里帮助(或者不值得努力,但我可能是错的)。你也可以像文本一样阅读文本,然后转换为日期时间。 – JohnE

+0

@JohnE这是40秒,parse_dates读取400k行。以字符串形式读取并稍后解析需要大致相同的时间 - 解析速度很慢。 – jf328

回答

4

这是一个更好的选择

以你的2线&使其400K,阅读他们在W/O解析为日期

In [34]: %timeit read_csv(StringIO(data + data2*200000),sep='\s+') 
1 loops, best of 3: 328 ms per loop 

In [35]: df = read_csv(StringIO(data + data2*200000),sep='\s+') 

解析的日期,你需要指定一个格式,因为这不是ISO 8601格式,因此在python空间中被解析

In [36]: %timeit pd.to_datetime(x.time,format='%Y.%m.%dT%H:%M:%S.%f') 
1 loops, best of 3: 2.43 s per loop 

In [37]: df.time = pd.to_datetime(df.time,format='%Y.%m.%dT%H:%M:%S.%f') 

In [38]: df.info() 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 400000 entries, 0 to 399999 
Data columns (total 6 columns): 
sym  400000 non-null object 
time  400000 non-null datetime64[ns] 
bid  400000 non-null float64 
ask  400000 non-null float64 
bsize 400000 non-null int64 
asize 400000 non-null int64 
dtypes: datetime64[ns](1), float64(2), int64(2), object(1) 
memory usage: 21.4+ MB 
+0

啊谢谢。没有注意到日期部分不是ISO格式 – jf328

+0

添加format参数对解析时间有巨大影响,因为我使用date_time作为%d /%m /%Y%H:%M:%S。 – Rodrigo