[英]Fastest way to read comma separated files (including datetimes) in python
我有數據存儲在逗號分隔的txt文件中。 其中一列代表日期時間。
我需要將每個列加載到單獨的numpy數組中(並將日期解碼為python datetime對象)。
最快的方法是什么(就運行時而言)?
NB。 這些文件是幾百MB的數據,目前需要幾分鍾才能加載。
例如mydata.txt
15,3,0,2003-01-01 00:00:00,12.2
15,4.5,0,2003-01-01 00:00:00,13.7
15,6,0,2003-01-01 00:00:00,18.4
15,7.5,0,2003-01-01 00:00:00,17.9
15,9,0,2003-01-01 00:00:00,17.7
15,10.5,0,2003-01-01 00:00:00,16.3
15,12,0,2003-01-01 00:00:00,17.2
這是我當前的代碼(它有效,但很慢):
import csv
import datetime
import time
import numpy
a=[]
b=[]
c=[]
d=[]
timestmp=[]
myfile = open('mydata.txt',"r")
# Read in the data
csv_reader = csv.reader(myfile)
for row in csv_reader:
a.append(row[0])
b.append(row[1])
c.append(row[2])
timestmp.append(row[3])
d.append(row[4])
a = numpy.array(a)
b = numpy.array(b)
c = numpy.array(c)
d = numpy.array(d)
# Convert Time string list into list of Python datetime objects
times = []
time_format = "%Y-%m-%d %H:%M:%S"
for i in xrange(len(timestmp)):
times.append(datetime.datetime.fromtimestamp(time.mktime(time.strptime(timestmp[i], time_format))))
有沒有更有效的方法來做到這一點?
非常感謝任何幫助 - 謝謝!
(編輯:最后,瓶頸結果是日期時間轉換,而不是像我最初假設的那樣讀取文件。)
首先,您應該使用Python的內置分析器運行示例腳本,以查看問題的實際位置。 您可以從命令行執行此操作:
python -m cProfile myscript.py
其次,至少對我有什么影響,為什么底部的循環必要? 有沒有技術上的原因,在你在numpy數組的實例化之上的循環中讀取mydata.txt
無法完成它?
第三,您應該直接創建datetime對象,因為它還支持strptime。 您不需要創建時間戳,創建時間,只需從時間戳創建日期時間。 您在底部的循環可以像這樣重寫:
times = []
timestamps = []
TIME_FORMAT = "%Y-%m-%d %H:%M:%S"
for t in timestmp:
parsed_time = datetime.datetime.strptime(t, TIME_FORMAT)
times.append(parsed_time)
timestamps.append(time.mktime(parsed_time.timetuple()))
我也可以自由地使用PEP-8代碼,例如將常量更改為全部大寫。 此外,您可以使用in
運算符迭代列表。
嘗試numpy.loadtxt()
, doc字符串有一個很好的例子。
你也可以嘗試在調用numpy.array時使用copy=False
,因為默認行為是復制它,這可以加速腳本(特別是因為你說它處理了大量數據)。
npa = numpy.array(ar, copy=False)
如果您遵循Mahmoud Abdelkader的建議並使用分析器,並發現瓶頸在csv
加載器中,您可以嘗試用以下代碼替換您的csv_reader:
for line in open("ProgToDo.txt"):
row = line.split(',')
a.append(int(row[0]))
b.append(int(row[1]))
c.append(int(row[2]))
timestmp.append(row[3])
d.append(float(row[4]))
但我認為更有可能是你有很多數據轉換。 如果你有數百萬次轉換,特別是時間轉換的最后一個循環需要很長時間! 如果你成功地一步完成(讀取+轉換),再加上Terseus建議不將數組復制到numpy dittos,你將減少執行時間。
我不完全確定這是否會有所幫助,但您可以通過使用ast.literal_eval
來加快文件的讀取速度。 例如:
from ast import literal_eval
myfile = open('mydata.txt',"r")
mylist = []
for line in myfile:
line = line.strip()
e = line.rindex(",")
row = literal_eval('[%s"%s"%s]' % (line[:e-19], line[e-19:e], line[e:]))
mylist.append(row)
a, b, c, timestamp, d = zip(*mylist)
# a, b, c, timestamp, and d are what they were after your csv_reader loop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.