从numpy数组中选择特定的月份日期(datetime对象)

时间:2015-04-08 08:50:14

标签: python datetime numpy

我有一个如下所示的数组,我想选择月份== 1和月份== 2和月份== 3的日期,我该怎么做?

a = np.array([datetime.datetime(2015, 1, 1, 10, 11, 55),
   datetime.datetime(2015, 1, 1, 20, 11, 55),
   datetime.datetime(2015, 2, 2, 6, 11, 55),
   datetime.datetime(2015, 3, 2, 16, 11, 55),
   datetime.datetime(2015, 2, 3, 2, 11, 55),
   datetime.datetime(2015, 1, 3, 12, 11, 55),
   datetime.datetime(2015, 4, 3, 22, 11, 55),
   datetime.datetime(2015, 3, 4, 8, 11, 55),
   datetime.datetime(2015, 5, 4, 18, 11, 55),
   datetime.datetime(2015, 1, 5, 4, 11, 55),
   datetime.datetime(2015, 3, 5, 14, 11, 55)]

2 个答案:

答案 0 :(得分:1)

只需选择月份所有内容< 4:

result1 = [d for d in a if d.month == 1 ]
result2 = [d for d in a if d.month == 2 ]
result3 = [d for d in a if d.month == 3 ]

返回:

result1 =
[datetime.datetime(2015, 1, 1, 10, 11, 55), 
 datetime.datetime(2015, 1, 1, 20, 11, 55), 
 datetime.datetime(2015, 1, 3, 12,11, 55), 
 datetime.datetime(2015, 1, 5, 4, 11, 55),

result2 =  
 [datetime.datetime(2015, 2, 2, 6, 11, 55), 
 datetime.datetime(2015, 2, 3, 2, 11, 55)]

result3 = 
 [datetime.datetime(2015, 3, 2, 16, 11, 55), 
 datetime.datetime(2015, 3, 4, 8, 11, 55), 
 datetime.datetime(2015, 3, 5, 14, 11, 55)]     

为您的例子。

答案 1 :(得分:1)

a是一个对象数组(dtype=object)。它存储指向datetime对象的指针,就像列表一样。大多数数学和逻辑运算都不适用于这种数组。这就是Wouter's回答使用列表推导的原因。

有一个np.datetime64 dtype实现了许多数字操作。大多数情况下,我在从csv文件(通过genfromtxt)生成的结构化数组的上下文中看到它。

a可以通过另一种理解转换为此类型:

In [202]: b=np.array([np.datetime64(x.isoformat(),'s') for x in a])
In [203]: b
Out[203]: 
array(['2015-01-01T10:11:55-0800', '2015-01-01T20:11:55-0800',
       '2015-02-02T06:11:55-0800', '2015-03-02T16:11:55-0800',
       '2015-02-03T02:11:55-0800', '2015-01-03T12:11:55-0800',
       '2015-04-03T22:11:55-0700', '2015-03-04T08:11:55-0800',
       '2015-05-04T18:11:55-0700', '2015-01-05T04:11:55-0800',
       '2015-03-05T14:11:55-0800'], dtype='datetime64[s]')

我没有看到拉出'月'本身的方法,但可以将其投放(查看)到一个月dtype

In [136]: b1=b.astype('datetime64[M]')

In [137]: b1
Out[137]: 
array(['2015-01', '2015-01', '2015-02', '2015-03', '2015-02', '2015-01',
       '2015-04', '2015-03', '2015-05', '2015-01', '2015-03'], dtype='datetime64[M]')

和用

生成的掩码
In [138]: b1==np.datetime64('2015-01')
Out[138]: 
array([ True,  True, False, False, False,  True, False, False, False,
        True, False], dtype=bool)

通过以下方式选择3个月的小组:

In [141]: a[b1==np.datetime64('2015-01')]
Out[141]: 
array([datetime.datetime(2015, 1, 1, 10, 11, 55),
       datetime.datetime(2015, 1, 1, 20, 11, 55),
       datetime.datetime(2015, 1, 3, 12, 11, 55),
       datetime.datetime(2015, 1, 5, 4, 11, 55)], dtype=object)

In [142]: a[b1==np.datetime64('2015-02')]
Out[142]: 
array([datetime.datetime(2015, 2, 2, 6, 11, 55),
       datetime.datetime(2015, 2, 3, 2, 11, 55)], dtype=object)

In [143]: a[b1==np.datetime64('2015-03')]
Out[143]: 
array([datetime.datetime(2015, 3, 2, 16, 11, 55),
       datetime.datetime(2015, 3, 4, 8, 11, 55),
       datetime.datetime(2015, 3, 5, 14, 11, 55)], dtype=object)

我对dtype做了很多。在这种情况下,我认为将a视为普通列表并没有多大优势,但如果您正在进行时间和日期差异,则数值数据时间值得考虑。