3

我有一个 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 获得我想要的行为?

4

2 回答 2

3

您可以定义一个矢量化属性获取器:

def func(a):
    return a.month

vfunc = np.vectorize(func)

然后使用:

np.where(vfunc(inp['Date_start']) == 7)
于 2012-08-22T17:50:43.227 回答
1

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

除了@user545424 建议的矢量化属性获取器之外,您还可以执行以下操作:

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 中日期的支持仍然被认为是实验性的。

于 2012-08-22T19:05:48.787 回答