在Python中最快读取逗号分隔文件(包括日期时间)的方法

2 投票
5 回答
8470 浏览
提问于 2025-04-16 13:11

我有一些数据存储在用逗号分隔的文本文件里。其中一列是日期时间。

我需要把每一列的数据加载到不同的numpy数组中(并把日期转换成Python的日期时间对象)。

有什么快速的方法可以做到这一点吗(从运行时间上考虑)?

注意:这些文件有几百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))))

有没有更高效的方法呢?

任何帮助都非常感谢 - 谢谢!

(补充:最后发现瓶颈在于日期时间的转换,而不是我最开始认为的读取文件。)

5 个回答

2

你可以在调用 numpy.array 时试着使用 copy=False,因为默认情况下它会复制数据,这样做可以加快脚本的运行速度(特别是你提到它处理很多数据的时候)。

npa = numpy.array(ar, copy=False)
3

试试 numpy.loadtxt() 这个函数,文档里有一个很好的例子。

8

首先,你应该用Python自带的性能分析工具来运行你的示例脚本,这样可以找出问题可能出在哪里。你可以在命令行中这样做:

python -m cProfile myscript.py

其次,至少我觉得,底部的那个循环为什么是必要的?有没有什么技术原因让它不能在你上面创建numpy数组的循环中直接读取mydata.txt呢?

第三,你应该直接创建日期时间对象,因为它也支持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操作符来遍历列表。

撰写回答