如何在布尔运算比较datetime对象属性的numpy数组时间上对布尔运算进行向量化?

时间:2016-03-21 19:07:56

标签: python arrays datetime numpy

当你想要比较日期时间对象属性的日期时间对象数组进行布尔运算时,有没有办法使用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循环来做到这一点,但我认为我至少应该能够在类似于第二次尝试的一行中执行此操作。

是否有可能对此陈述进行矢量化?如果没有,我在第二次尝试中做错了什么?感谢。

3 个答案:

答案 0 :(得分:1)

您可以使用pandas

;WITH IntermediateResults AS (
    SELECT
        DISTINCT EventLocation,
        PERCENTILE_CONT(.90) 
            WITHIN GROUP (ORDER BY (DATEDIFF(MINUTE, StartTime, EndTime)) ASC) 
            OVER (PARTITION BY EventLocation) 
            AS 'P90',
        AVG(DATEDIFF(MINUTE, StartTime, EndTime))
            OVER (PARTITION BY EventLocation) 
            AS 'Mean'
    FROM MyTable
    ORDER BY N DESC
)

SELECT
    *,
    AVG(DATEDIFF(MINUTE, StartTime, EndTime))
        OVER (PARTITION BY EventLocation) 
        HAVING (DATEDIFF(MINUTE, StartTime, EndTime) <= P90)
        AS 'Mean90'
FROM IntermediateResults

或者作为NumPy数组的bools:

>>> import pandas as pd
>>> ser = pd.Series([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)])

>>> ser[ser.dt.year==2014]
0   2014-01-04 12:02:01
1   2014-01-04 12:02:01
2   2014-01-06 12:02:01
3   2014-01-05 12:02:01
4   2014-01-04 12:02:01
dtype: datetime64[ns]

答案 1 :(得分:1)

试试numpy's own datetime64 dtype。你可能需要做一些算术来解决这些年。或者,您可以使用具有Unix时间戳整数的数组。

答案 2 :(得分:0)

或者你可以,如你所说,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)