Ответ 1
Я знаю, что это старый вопрос, но я постараюсь ответить, если кто-то еще встретит это.
- Начиная с 1.11,
numpy
не пытается автоматически конвертировать итерации объектов date/datetime в массивы datetime64, это довольно ясно из this excerpt в тестовом наборе:
# at the moment, we don't automatically convert these to datetime64
dt = datetime.date(1970, 1, 1)
arr = np.array([dt])
assert_equal(arr.dtype, np.dtype('O'))
dt = datetime.datetime(1970, 1, 1, 12, 30, 40)
arr = np.array([dt])
assert_equal(arr.dtype, np.dtype('O'))
В идеале numpy
будет означать, что datetime64
с правильными единицами можно использовать; см. этот вопрос.
-
При построении
datetime64
из скаляра единица, установленная дляM8[D]
для объектов даты иM8[us]
для объектов datetime (соответствующий тест). -
Когда вы указываете
dtype='datetime64'
или, аналогично,dtype='M8'
, единицы устанавливаются в "generic", который позже разрешается доM8[D]
(хотя было бы логично разрешить егоM8[D]
, см. этот вопрос):
>>> np.datetime_data(np.dtype('datetime64'))
('generic', 1)
>>> np.datetime_data(np.dtype('M8'))
('generic', 1)
>>> np.datetime_data(np.dtype('M8[D]'))
('D', 1)
>>> np.datetime_data(np.dtype('M8[us]'))
('us', 1)
-
given_times.astype('datetime64')
больше не вызывает исключение - это было fixed в 1.11. -
Начиная с 1.11, объекты datetime64 являются часовыми наивными, поэтому передача объекта datetime с помощью
tzinfo
, установленного как в предоставленном пример вызовет предупреждение об отказе.