2014-10-05 40 views
3

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 USNetPrice值对每个Date。为此,我使用下面的代码:

convertingdates = strpdate2num(micro_info[1:,2]) 
datesasfloat = {1: convertingdates} 
micro_info = np.genfromtxt('MICRO.csv', delimiter=',', dtype=None, converters = datesasfloat, names=True) 

我会再访问DatesNetPrice要求。

谢谢

+0

为什么你要指定'delimiter =',''?我在文件样本中看不到任何','? – hpaulj 2014-10-05 20:31:20

+0

@hpaulj它是一个CSV文件,所以我认为它的'逗号'是分开的。 – user131983 2014-10-05 20:36:16

+0

如果没有逗号,它不是用逗号分隔的。 – farenorth 2014-10-05 21:00:26

回答

3

与您的示例文本,这个工程:

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