从python中的大型csv数据文件中提取几行数据的有效方法

时间:2015-04-18 12:17:32

标签: python performance csv pandas

我有大量的csv数据文件,每个数据文件包含以下形式的一个自动收报机的几天价值的滴答数据:

 ticker  DD/MM/YYYY    time         bid      ask
  XXX,   19122014,  08:00:08.325,  9929.00,9933.00
  XXX,   19122014,  08:00:08.523,  9924.00,9931.00
  XXX,   19122014,  08:00:08.722,  9925.00,9930.50
  XXX,   19122014,  08:00:08.921,  9924.00,9928.00
  XXX,   19122014,  08:00:09.125,  9924.00,9928.00
  …
  XXX,   30122014,  21:56:25.181,  9795.50,9796.50
  XXX,   30122014,  21:56:26.398,  9795.50,9796.50
  XXX,   30122014,  21:56:26.598,  9795.50,9796.50
  XXX,   30122014,  21:56:26.798,  9795.50,9796.50
  XXX,   30122014,  21:56:28.896,  9795.50,9796.00
  XXX,   30122014,  21:56:29.096,  9795.50,9796.50
  XXX,   30122014,  21:56:29.296,  9795.50,9796.00
  …

我需要提取时间在一定范围内的任何数据行,比如:09:00:00到09:15:00。我目前的解决方案是简单地将每个数据文件读入数据框,按时间顺序排序,然后使用searchsorted查找09:00:00到09:15:00。如果性能不是问题并且我没有1000个文件等待处理它,它工作正常。有关如何提高速度的任何建议?提前感谢您的帮助!!!

2 个答案:

答案 0 :(得分:2)

简短回答:将您的数据放入SQL数据库,然后给出" time"列索引。你不能用CSV文件击败它 - 不管是否使用Pandas。

如果不更改您的CSV文件,可以更快一点,但在阅读时过滤行并不多 - 并且在内存中只有您感兴趣的行。

因此,不仅仅将整个CSV放入内存,这样的功能可以完成这项工作:

import csv

def filter_time(filename, mintime, maxtime):
    timecol = 3
    reader = csv.reader(open(filename))
    next(reader)
    return [line for line in reader if mintime <= line[timecol] <= maxtime]

这个任务很容易瘫痪 - 你可以在最大化设备上的I / O之前得到一些同时运行的实例,我猜。一种无痛的方法是使用lelo Python包 - 它只是为您提供了一个@paralel装饰器,它使得给定的函数在调用时在另一个进程中运行,并返回结果的惰性代理。

但是仍然必须阅读所有内容 - 我认为SQL解决方案应该至少快一个数量级。

答案 1 :(得分:0)

我的解决方案是逐行阅读并仅保存通过过滤器的内容:

with open('filename.csv') as fin:
    with open('fileout.csv', 'w') as fout:
        while True:
            line = fin.readline()
            if not line:
                break
            time_x = line.rstrip('\n').split(',')[2]
            # some parsing of time to do properly
            if a< time_x < b:
                fout.write(line)