Запросы об использовании массивов NumPy для анализа файла CSV

Q1 : У меня странная проблема, которую я не могу понять.

Я просматриваю файл CSV с помощью модуля NumPy, где показана часть файла CSV (содержащая 253 строки и 4 столбца):

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 

Я просматриваю файл CSV, используя следующий код:

 micro_info = np.genfromtxt('MICRO.csv', delimiter=',', dtype=None, names=True) 

Однако, когда я запускаю код ниже, я получаю, что первая строка дает мне (253,) , но вторая строка печатает необходимое содержимое файла CSV, содержащего все 253 строки и 4 столбца. Я не понимаю, почему это так .

 print micro_info.shape print micro_info 

Q2 : Делает ли то, что я делаю ниже, имеет смысл?

Я по существу NetPrice преобразовать Dates в плавающие, чтобы использовать Matplotlib для NetPrice значений NetPrice для MICRO US против каждой Date . Для этого я использую следующий код:

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

Затем я NetPrice доступ к 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)