Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在布尔操作比较datetime对象属性的datetime的numpy数组上对布尔操作进行矢量化?_Python_Arrays_Datetime_Numpy - Fatal编程技术网

Python 如何在布尔操作比较datetime对象属性的datetime的numpy数组上对布尔操作进行矢量化?

Python 如何在布尔操作比较datetime对象属性的datetime的numpy数组上对布尔操作进行矢量化?,python,arrays,datetime,numpy,Python,Arrays,Datetime,Numpy,在对要比较datetime对象属性的datetime对象数组执行布尔操作时,是否有方法使用numpy的矢量化功能 我天真的第一次尝试是: import datetime as dtm import numpy as np dt = np.array([dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,6,12,2,1), dtm.datetime(2014,1,5,12,2,1),

在对要比较datetime对象属性的datetime对象数组执行布尔操作时,是否有方法使用numpy的矢量化功能

我天真的第一次尝试是:

import datetime as dtm
import numpy as np
dt = np.array([dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,6,12,2,1), dtm.datetime(2014,1,5,12,2,1), dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2013,1,4,13,3,1), dtm.datetime(2013,1,5,22,2,1)])

bool = (dt.year == 2014)
这给了我一个错误:

AttributeError: 'numpy.ndarray' object has no attribute 'year'
回想起来,这是显而易见的

我不认为我第二次天真的尝试是可以矢量化的,但我认为这会完成工作:

bool = np.array([dts.year == 2014 for dts in dt])
但是,我得到了一个错误:

SyntaxError: invalid syntax
我不明白我在这句话中做错了什么

我更喜欢矢量化的解决方案,我可以使用for循环来实现这一点,但我认为我至少应该能够在一行中实现这一点,类似于我的第二次尝试

是否可以将此语句矢量化?如果没有,我在第二次尝试中做错了什么?谢谢。

您可以使用:

或布尔作为NumPy数组:

>>> (ser.dt.year==2014).values
array([ True,  True,  True,  True,  True, False, False], dtype=bool)

试试看。你可能需要做一些算术来计算年份。或者,您可以使用带有Unix时间戳整数的数组。

或者,正如您所说的,
矢量化

import datetime as dtm
import numpy as np
dt = np.array([dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,6,12,2,1), dtm.datetime(2014,1,5,12,2,1), dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2013,1,4,13,3,1), dtm.datetime(2013,1,5,22,2,1)])

is_2014 = np.vectorize(lambda d: d.year == 2014)

bool_ = is_2014(dt)

请注意,
np.vectorize
不一定比纯Python循环提供更好的性能,并且主要用作语法糖。

无效语法可能是因为您需要括号,因此您有一个布尔对象来生成列表。肯定还有其他错误,我刚试过,我得到了同样的错误。@Ilja好的,当我第一次测试你的评论时,我使用dt14=[(dts==2014)for dts in dt]测试了它,这正是我试图达到的目的。我忽略了第二个[],因此dt14=[[(dts==2014)对于dt]]中的dts有效。非常感谢。嗯,我的意思是你的第一次尝试:)很好,你找到了一个解决方案。我假设numpy必须能够更有效地使用datetime64,否则它就不会被开发出来。我使用datetime模块处理了很多代码,所以我想知道切换到使用datetime64有什么好处。它的效率是否显著提高?还有其他优势吗?我注意到前面提到的datetime64,但从未研究过它的优点。它可能确实有点依赖于手头的问题(比较例如和),但我认为对于您的问题,它应该更快(如果阵列足够大)。缺点是界面不如datetime好(没有
.year
等方法)。我刚刚意识到我忽略了询问pandas是否对其操作进行了矢量化。过去我对它做过一些尝试,但我对python还是新手,决定等到我对已经拥有的工具感到更舒服时再做。但是如果pandas矢量化操作,也许我应该开始学习更多关于它的知识,因为我对其他一些工具比较熟悉。从numpy文档中的矢量化:矢量化功能主要是为了方便,而不是为了性能。该实现本质上是一个for循环。因此,这不是一个有效的优化,矢量化通常是一个用例。Butler注意,无论是问题还是答案都与性能无关。当然,这是一篇老文章,有更好的方法来解决这个问题。我是在搜索了一些关于“布尔运算矢量化”的内容后来到这里的,这是对性能的充分需求,考虑到你的文章在谷歌的搜索结果中排名靠前,对我来说是误导性的,因为它并不是真正的文档矢量化。我不认为为其他人澄清这一点是不合理的,因为他们可能最终以相同或相似的方式从谷歌搜索中获得。听起来很公平,似乎许多人期望基于函数名的
np.vectorize
。我编辑了答案,以澄清性能方面的问题。
import datetime as dtm
import numpy as np
dt = np.array([dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2014,1,6,12,2,1), dtm.datetime(2014,1,5,12,2,1), dtm.datetime(2014,1,4,12,2,1), dtm.datetime(2013,1,4,13,3,1), dtm.datetime(2013,1,5,22,2,1)])

is_2014 = np.vectorize(lambda d: d.year == 2014)

bool_ = is_2014(dt)