1

我正在尝试将日期时间数组与单个日期时间进行比较

tt = np.array([['1993-09-01T00:00:00.000000000', 
        '2005-12-01T00:00:00.000000000'],
       ['1992-07-01T00:00:00.000000000', 
        '2009-05-01T00:00:00.000000000']], dtype='datetime64[ns]')
tt > dt.datetime(2001,1,1)

它给了我一个错误。 TypeError: '>' not supported between instances of 'int' and 'datetime.datetime' 我可以知道如何将我的日期时间数组与单个日期时间进行比较吗?

结果我期望它 np.arrary([[False, True],[False, True]])

4

2 回答 2

1

原因是 datetime 对象与 numpy.datetime 对象不同。因此,您正在比较不同的对象,因此会出现错误。试试这行代码:

tt = np.array([['1993-09-01T00:00:00.000000000', 
        '2005-12-01T00:00:00.000000000'],
       ['1992-07-01T00:00:00.000000000', 
        '2009-05-01T00:00:00.000000000']], dtype='datetime64')
tt > np.datetime64('2001-01-01')

你会得到想要的结果!

于 2019-08-08T14:08:09.483 回答
0

当尝试将 numpy 对象与另一种类型的对象进行比较时,numpy 将尝试进行转换。在这里,目标是一个不属于 numpy 的 Python 对象,因此 numpy 会将 numpy 日期转换为 Python 对象。人们会期望生成的 Python 对象是 a datetime.datetime,但由于它不支持纳秒,numpy 将其转换为 a int

请参阅 numpy 代码的相关部分。 https://github.com/numpy/numpy/blob/608329acac78b98e9c1044dca23a4f287d639b24/numpy/core/src/multiarray/datetime.c#L2847

例如,您可以尝试:

>>> np.array(['2009-05-01T00:00:00.000000000'], dtype='datetime64[ns]').tolist()
[1241136000000000000]

Pythonint无法与 进行比较datetime.datetime,因此出现错误。

但是,如果 numpy 日期时间可以表示为 a datetime.datetime(如果其精度高于微秒并且在有效日期时间范围内),它将被转换为 adatetime.datetime而不是 a int。尝试例如:

>>> np.array(['2009-05-01T00:00:00.000000000'], dtype='datetime64[us]').tolist()
[datetime.datetime(2009, 5, 1, 0, 0)]

因此,要使您的示例正常工作,您只需将dtypefrom更改datetime64[ns]datetime64[us],它的行为就应该符合您的预期。

请注意,此行为与数组无关。

>>> np.datetime64('2009-05-01T00:00:00.000000000', 'ns') > dt.datetime(2001, 1, 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'int' and 'datetime.datetime'
>>> np.datetime64('2009-05-01T00:00:00.000000000', 'us') > dt.datetime(2001, 1, 1)
True
于 2019-08-08T14:14:08.813 回答