我有一个如下所示的数组,我想选择月份== 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)]
答案 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
视为普通列表并没有多大优势,但如果您正在进行时间和日期差异,则数值数据时间值得考虑。