我有一个numpy对象,格式如下:
date,column1,column2,column3,column4,,column5,,column6,,column7,,column8,,column9,,column10
date,column1,column2,column3,column4,,column5,,column6,,column7,,column8,,column9,,column10
date,column1,column2,column3,column4,,column5,,column6,,column7,,column8,,column9,,column10
...
我试图只检索满足特定日期条件的行,例如日期大于2005的所有行,如下所示(myData是一个numpy对象):
li = (myData[:,0] > myData[2][0].year)
但是我一直收到以下错误:
too many indices for array,
形状是(128,) dtype是[('Date','O'),('SF1.AAPL_DEBT_MRQ - Value','
有人可以提前告知,谢谢!
答案 0 :(得分:1)
这是建立在@hpaulj的答案之上的,我添加的缺失步骤是将布尔值列表转换为ndarray
% cat puff.csv
date,pippo,pluto,paperino
2012-10-20,3.,5.,6.
2013-05-22,4.,6.,2.
2013-07-31,5.,1.,6.
2014-10-08,0.,3.,4.
% ipython
Python 2.7.8 (default, Oct 18 2014, 12:50:18)
Type "copyright", "credits" or "license" for more information.
IPython 2.3.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import numpy as np
In [2]: l = np.genfromtxt('puff.csv', dtype=None, delimiter=',', skip_header=1)
In [3]: print l
[('2012-10-20', 3.0, 5.0, 6.0) ('2013-05-22', 4.0, 6.0, 2.0)
('2013-07-31', 5.0, 1.0, 6.0) ('2014-10-08', 0.0, 3.0, 4.0)]
In [4]: l[np.array([x[0][:4]<'2014' for x in l])]
Out[4]:
array([('2012-10-20', 3.0, 5.0, 6.0), ('2013-05-22', 4.0, 6.0, 2.0),
('2013-07-31', 5.0, 1.0, 6.0)],
dtype=[('f0', 'S10'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])
In [5]: print l[np.array([x[0][:4]<'2014' for x in l])]
[('2012-10-20', 3.0, 5.0, 6.0) ('2013-05-22', 4.0, 6.0, 2.0)
('2013-07-31', 5.0, 1.0, 6.0)]
In [6]:
答案 1 :(得分:0)
这看起来像一个结构化数组,很可能是通过读取csv
(带np.genfromtxt
)的数据创建的。如果是这样,它可能是一维的复杂dtype
。假设第一个字段被称为&#39; Date&#39;,那么您可以使用
myData['Date']
第一行的数据将是
myData[0]
第一个日期可以是myData[0]['Date']
或myData['Date'][0]
。
正如我猜测的那样,这是一个1d结构化数组:
shape = (128,)
type = [('Date', 'O'), ('SF1.AAPL_DEBT_MRQ - Value', '<f8'), ....)]
'O'
表示日期是一个对象,可能是任何东西,所以我无法对其格式或内容说些什么。
尝试:
li = [date.year>2005 for date in myData['Date']
这至少应该使索引正确。我猜测每个&#39; date&#39;有一个&#39;年&#39;可以与&#39; 2005&#39;进行比较的属性。这应该给出128长的真/假列表。
尝试使用:
myData[li]
获取符合条件的行。您可能必须将li
转换为数组或索引号列表。但无论如何,myData
将始终使用一个值或列表编制索引。 too many indices
错误意味着当它实际上只是1d时,你将它视为二维数组。
可以使用字段名称读取gboffi的数据,如
data = np.genfromtxt('puff.csv', dtype=None, delimiter=',', names=True)
结果为dtype
dtype([('date', 'S10'), ('pippo', '<f8'), ('pluto', '<f8'), ('paperino', '<f8')])
可以在以下位置找到所需的行:
I=[x[:4]<'2014' for x in data['date']]
# the 'date' field can be selected before or after element selection
# [True, True, True, False]
data[np.array(I)]
numpy
有datetime64
类型,可用于比较:
dates=[np.datetime64(x) for x in data['date']]
I = dates<np.datetime64('2014-01-01')
# array([ True, True, True, False], dtype=bool)
data[I]
如果日期格式正确,genfromtxt
可以进行字符串到日期转换:
In [206]: data = np.genfromtxt(txt, dtype=('datetime64[D]','f8','f8','f8'), delimiter=',', names=True)
In [207]: data
Out[207]:
array([(datetime.date(2012, 10, 20), 3.0, 5.0, 6.0),
(datetime.date(2013, 5, 22), 4.0, 6.0, 2.0),
(datetime.date(2013, 7, 31), 5.0, 1.0, 6.0),
(datetime.date(2014, 10, 8), 0.0, 3.0, 4.0)],
dtype=[('date', '<M8[D]'), ('pippo', '<f8'), ('pluto', '<f8'), ('paperino', '<f8')])
年份选择可以通过以下方式完成:
In [208]: data[data['date']<np.datetime64('2014','Y')]
Out[208]:
array([(datetime.date(2012, 10, 20), 3.0, 5.0, 6.0),
(datetime.date(2013, 5, 22), 4.0, 6.0, 2.0),
(datetime.date(2013, 7, 31), 5.0, 1.0, 6.0)],
dtype=[('date', '<M8[D]'), ('pippo', '<f8'), ('pluto', '<f8'), ('paperino', '<f8')])
甚至是日期选择:
In [209]: data[data['date']<np.datetime64('2013-06-01','D')]
Out[209]:
array([(datetime.date(2012, 10, 20), 3.0, 5.0, 6.0),
(datetime.date(2013, 5, 22), 4.0, 6.0, 2.0)],
dtype=[('date', '<M8[D]'), ('pippo', '<f8'), ('pluto', '<f8'), ('paperino', '<f8')])