关于使用NumPy数组解析CSV文件的疑问
问题描述:
Q1:我有一个奇怪的问题,我似乎无法弄清楚。关于使用NumPy数组解析CSV文件的疑问
我通过使用NumPy的模块,其中,如下所示(其中包含253行和4列)的CSV文件的一部分的CSV文件解析:我通过解析
Code Date NetPrice Gain
MICRO US 01/05/2012 613.98 0
MICRO US 01/06/2012 622.75 1.09342432
MICRO US 01/07/2012 690.99 -0.44342342
MICRO US 01/08/2012 611.26 -3.242423423
micro_info = np.genfromtxt('MICRO.csv', delimiter=',', dtype=None, names=True)
然而,当我运行下面的代码,我得到的第一行给我(253,)
,但第二行打印的CSV文件中包含所有253行所需的内容和:使用下面的代码CSV文件4列。 我不明白为什么这是如此。
print micro_info.shape
print micro_info
Q2:请问我在做什么下面有意义吗?
我基本上是着眼于Dates
转换为浮动,这样我可以用Matplotlib
绘制的MICRO US
的NetPrice
值对每个Date
。为此,我使用下面的代码:
convertingdates = strpdate2num(micro_info[1:,2])
datesasfloat = {1: convertingdates}
micro_info = np.genfromtxt('MICRO.csv', delimiter=',', dtype=None, converters = datesasfloat, names=True)
我会再访问Dates
和NetPrice
要求。
谢谢
答
与您的示例文本,这个工程:
In [314]: dconverter=pylab.strpdate2num('%M/%S/%Y')
In [316]: names='code us Date NetPrice Gain'.split()
In [317]: data=np.genfromtxt(ss,skip_header=1,dtype=None,
converters={'Date':dconverter},names=names)
In [318]: data.shape
Out[318]: (4,)
In [319]: data['Date']
Out[319]:
array([ 734503.00075231, 734503.00076389, 734503.00077546,
734503.00078704])
In [320]: data['NetPrice']
Out[320]: array([ 613.98, 622.75, 690.99, 611.26])
它使用默认的空格分隔符。由于这种分裂'MICRO US',我使用了一个自定义名称列表,而不是标题行。我改进了您对strpdate2num
的使用。
如果文件是逗号分隔,那么这将工作(并使用修正过的数据转换器):
In [410]: dconverter=pylab.strpdate2num('%m/%d/%Y')
In [412]: data=np.genfromtxt(ss,names=True,delimiter=',',dtype=None,
autostrip=True,converters={'Date':dconverter})
In [413]: data
Out[413]:
array([('MICRO US', 734507.0, 613.98, 0.0),
('MICRO US', 734508.0, 622.75, 1.09342432),
('MICRO US', 734509.0, 690.99, -0.44342342),
('MICRO US', 734510.0, 611.26, -3.242423423)],
dtype=[('Code', 'S8'), ('Date', 'O'), ('NetPrice', '<f8'), ('Gain', '<f8')])
另一种方式来处理“分隔符”是给字段宽度的列表。出于某种原因,这需要明确的dtype
。
dt=np.dtype([('Code', 'S8'), ('Date', 'O'), ('NetPrice', '<f8'), ('Gain', '<f8')])
data=np.genfromtxt(ss, names=True, delimiter=[15,10,11,12],
converters={'Date':dconverter}, dtype=dt)
+0
我想你想把'%m /%d /%Y'作为'dconverter'的格式字符串。 – farenorth 2014-10-06 00:43:05
为什么你要指定'delimiter =',''?我在文件样本中看不到任何','? – hpaulj 2014-10-05 20:31:20
@hpaulj它是一个CSV文件,所以我认为它的'逗号'是分开的。 – user131983 2014-10-05 20:36:16
如果没有逗号,它不是用逗号分隔的。 – farenorth 2014-10-05 21:00:26