小伙子,我有请客给你吗?numpy.genfromtxt有一个converters
参数,它允许您在解析文件时为每一列指定一个函数。该函数被提供 CSV 字符串值。它的返回值成为numpy数组中的对应值。
此外,该dtype = None
参数告诉genfromtxt
对每列的类型进行智能猜测。特别是,数字列会自动转换为适当的 dtype。
例如,假设您的数据文件包含
2011-06-19 17:29:00.000,72,44,56
然后
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)
产量
(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)
产量
(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)
您可能也有兴趣查看基于构建的pandasnumpy
模块,该模块将解析 CSV 提升到更高级别:它有一个pandas.read_csv函数,其parse_dates = True
参数将自动解析日期字符串(使用dateutil)。
使用熊猫,你的 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 --
pands.read_csv returns a
DataFrame,而不是 numpy 数组。实际上可能对您的DataFrame
目的更有用,但您应该知道它是一个不同的对象,具有全新的开发和探索方法世界。