在numpy.where中访问对象方法?

时间:2012-08-22 17:22:41

标签: python date numpy

我有一个numpy数组中的数据(从.csv文件中读取)。来自np.genfromtxt的相关摘录是:

dtype = [("Category", "|S10"),
         ("Status", "|S11"),
         ("Date_start", object),
         ("Date_stop", object)],
names=True,
converters={2:lambda d:datetime.strptime(d, "%d/%m/%y"),
            3:lambda d:datetime.strptime(d, "%d/%m/%y")}
)

一切都有一个例外 - 访问日期时间对象的元素。以下两行代码完全符合我的期望:

print inp['Date_start'][1].month #returns 7
print np.where(inp['Category'] == '"R5"') #returns an array of matching indices

但以下代码行会引发AttributeError: 'numpy.ndarray' object has no attribute 'month'

print np.where(inp['Date_start'].month == 7)

这意味着我无法根据发生的事情返回结果,我需要这样做。

有没有办法从np.where获得我想要的行为?

2 个答案:

答案 0 :(得分:3)

您可以定义矢量化属性getter:

def func(a):
    return a.month

vfunc = np.vectorize(func)

然后使用:

np.where(vfunc(inp['Date_start']) == 7)

答案 1 :(得分:1)

正如您所注意到的那样,inp['Date_Start']是标准ndarray dtype='object',因此,它没有其元素的属性。

除了@ user545424建议的矢量化属性getter,您可以执行以下操作:

test = np.fromiter((i.month == 7 for i in inp['Date_start']), 
                   count=inp.size, dtype=bool) 

count=inp.size帮助np.fromiter更有效地运行。请查看函数的文档。

从那里,您可以使用test过滤所需的元素,或使用np.zeros(test)获取满足条件的项目的索引。

但是,如果你有很多日期处理,你可能需要考虑使用pandas,它接管了scikits.timseries的大多数功能。在我写这篇文章时,对numpy日期的支持仍被认为是实验性的。