[英]efficient way to extract few lines of data from a large csv data file in python
我有大量的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個文件,它會很好地工作。 關於如何提高速度有什么建議嗎? 預先感謝您的幫助!!!
簡短的答案:將您的數據放入SQL數據庫,並為“時間”列提供索引。 您不能使用CSV文件來擊敗它-是否使用熊貓。
在不更改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
方法是使用lelo
Python軟件包-它只為您提供@paralel
裝飾器,該裝飾器使給定函數在調用時在另一個進程中運行,並返回結果的惰性代理。
但這仍然需要閱讀所有內容-我認為SQL解決方案應該至少快大約一個數量級。
我的解決方案是逐行讀取並僅保存通過過濾器的內容:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.