CSV文件可能不干净(元素数量不一致的行),需要忽略不清洁的行。 处理过程中需要字符串操作。
示例输入:
20150701 20:00:15.173,0.5019,0.91665
所需的输出:float32(伪日期,当天的秒数,f3,f4)
0.150701 72015.173 0.5019 0.91665 (+ the trailing trash floats usually get)
CSV文件也很大,内存中的numpy数组预计需要5-10 GB,CSV文件超过30GB。
寻找一种有效的方法来处理CSV文件并最终得到一个numpy数组。
当前解决方案:使用csv模块,逐行处理并使用list()作为缓冲区,稍后将使用asarray()转换为numpy数组。问题是,在转换过程中,内存消耗加倍,复制过程增加了执行开销。
Numpy的genfromtxt和loadtxt似乎无法按需处理数据。
答案 0 :(得分:1)
如果您事先知道数据中有多少行,您可以省去中间list
并直接写入数组。
import numpy as np
no_rows = 5
no_columns = 4
a = np.zeros((no_rows, no_columns), dtype = np.float)
with open('myfile') as f:
for i, line in enumerate(f):
a[i,:] = cool_function_that_returns_formatted_data(line)
答案 1 :(得分:1)
你认为使用pandas read_csv(引擎=' C')
我发现它是处理csv的最佳和最简单的解决方案之一。我使用4GB文件,它对我有用。
import pandas as pd
df=pd.read_csv('abc.csv',engine='C')
print(df.head(10))
答案 2 :(得分:0)
我认为i/o capability of pandas是将数据转换为numpy数组的最佳方法。具体来说,read_csv方法将读入pandas DataFrame。然后,您可以使用返回的DataFrame
的{{3}}方法访问基础numpy数组。