男孩,我有请你吃吗?numpy.genfromtxt http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html has a converters
参数,它允许您在解析文件时为每一列指定一个函数。该函数接收 CSV 字符串值。它的返回值成为numpy数组中的对应值。
而且,dtype = None
参数告诉genfromtxt
对每列的类型做出明智的猜测。特别是,数字列会自动转换为适当的数据类型。
例如,假设您的数据文件包含
2011-06-19 17:29:00.000,72,44,56
Then
import numpy as np
import datetime as DT
def make_date(datestr):
return DT.datetime.strptime(datestr, '%Y-%m-%d %H:%M:%S.%f')
arr = np.genfromtxt(filename, delimiter = ',',
converters = {'Date':make_date},
names = ('Date', 'Stock', 'Action', 'Amount'),
dtype = None)
print(arr)
print(arr.dtype)
yields
(datetime.datetime(2011, 6, 19, 17, 29), 72, 44, 56)
[('Date', '|O4'), ('Stock', '<i4'), ('Action', '<i4'), ('Amount', '<i4')]
您的真实 csv 文件有更多列,因此您需要向其中添加更多项目names
,但除此之外,该示例仍然有效。
如果你并不真正关心额外的列,你可以指定一个像这样的绒毛名称:
arr = np.genfromtxt(filename, delimiter=',',
converters={'Date': make_date},
names=('Date', 'Stock', 'Action', 'Amount') +
tuple('col{i}'.format(i=i) for i in range(22)),
dtype = None)
yields
(datetime.datetime(2011, 6, 19, 17, 29), 72, 44, 56, 0.4772, 0.3286, 0.8497, 31.3587, 0.3235, 0.9147, 28.5751, 0.3872, 0.2803, 0, 0.2601, 0.2073, 0.1172, 0, 0.0, 0, 5.8922, 1, 0, 0, 0, 1.2759)
您可能还有兴趣查看pandas http://pandas.pydata.org/模块是建立在numpy
,这将解析 CSV 提升到了一个更高的水平:它有一个pandas.read_csv http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html函数其parse_dates = True
参数将自动解析日期字符串(使用dateutil http://labix.org/python-dateutil#head-c0e81a473b647dfa787dc11e8c69557ec2c3ecd2).
使用 pandas,您的 csv 可以解析为
df = pd.read_csv(filename, parse_dates = [0,1], header = None,
names=('Date', 'Stock', 'Action', 'Amount') +
tuple('col{i}'.format(i=i) for i in range(22)))
注意不需要指定make_date
功能. Just to be clear --
pandas.read_csvreturns a
DataFrame,而不是 numpy 数组。这DataFrame
实际上可能对您的目的更有用,但您应该意识到它是一个不同的对象,具有可供利用和探索的全新方法世界。