我有数据存储在逗号分隔的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
Run Code Online (Sandbox Code Playgroud)
这是我当前的代码(它有效,但很慢):
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))))
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方法来做到这一点?
非常感谢任何帮助 - 谢谢!
(编辑:最后,瓶颈结果是日期时间转换,而不是我原先假设的那样读取文件.)
首先,您应该使用Python的内置分析器运行示例脚本,以查看问题的实际位置.您可以从命令行执行此操作:
python -m cProfile myscript.py
Run Code Online (Sandbox Code Playgroud)
其次,至少会对我产生什么影响,为什么底部的循环必要?是否存在技术原因,在读取mydata.txtnumpy数组实例化之上的循环时无法完成?
第三,您应该直接创建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()))
Run Code Online (Sandbox Code Playgroud)
我也可以自由地使用PEP-8代码,例如将常量更改为全部大写.此外,您只需使用in运算符即可迭代列表.
| 归档时间: |
|
| 查看次数: |
8302 次 |
| 最近记录: |