我有一个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获得我想要的行为?
答案 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日期的支持仍被认为是实验性的。