簡體   English   中英

在python中讀取逗號分隔文件(包括日期時間)的最快方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM