Преобразовать numpy.datetime64 в строковый объект в python

У меня возникла проблема с преобразованием объекта python datetime64 в строку. Например:

t = numpy.datetime64('2012-06-30T20:00:00.000000000-0400')

В:

'2012.07.01' as a  string. (note time difference)

Я уже пытался преобразовать объект datetime64 в datetime long, а затем в строку, но мне кажется, что эта ошибка:

dt = t.astype(datetime.datetime) #1341100800000000000L
time.ctime(dt)
ValueError: unconvertible time

Ответы

Ответ 1

Решение было:

import pandas as pd 
ts = pd.to_datetime(str(date)) 
d = ts.strftime('%Y.%m.%d')

Ответ 2

Если вы не хотите делать это преобразование gobbledygook и поддерживаете только один формат даты, это было лучшим решением для меня

str(t)[:10]
Out[11]: '2012-07-01'

Ответ 3

Мне нужна строка в формате ISO 8601 без каких-либо дополнительных зависимостей. Мой numpy_array имеет один элемент как datetime64. С помощью @Wirawan-Purwanto я немного добавил:

from datetime import datetime   

ts = numpy_array.values.astype(datetime)/1000000000
return datetime.utcfromtimestamp(ts).isoformat() # "2018-05-24T19:54:48"

Ответ 4

Существует маршрут без использования pandas; но см. ниже описание.

Ну, переменная t имеет разрешение наносекунд, которое может быть показано путем проверки в python:

>>> numpy.dtype(t)
dtype('<M8[ns]')

Это означает, что интегральное значение этого значения в 10-9 раз меньше отметки времени UNIX. Значение, указанное в вашем вопросе, дает этот намек. Лучше всего разделить интегральное значение t на 1 миллиард, тогда вы можете использовать time.strftime:

>>> import time
>>> time.strftime("%Y.%m.%d", time.gmtime(t.astype(int)/1000000000))
2012.07.01

Используя это, будьте в курсе двух предположений:

1) разрешение datetime64 является наносекундным

2) время, хранящееся в datetime64, находится в формате UTC

Боковое примечание 1: Интересно, что разработчики numpy решили [1], что объект datetime64, имеющий разрешение больше, чем микросекунда, будет передан в тип long, что объясняет, почему t.astype(datetime.datetime) дает 1341100800000000000L. Причина в том, что объект datetime.datetime не может точно представлять наносекунду или более точный масштаб, поскольку разрешение, поддерживаемое datetime.datetime, составляет только микросекунду.

Боковое примечание 2: Остерегайтесь различных соглашений между numpy 1.10 и более ранним vs 1.11 и новее:

  • в numpy <= 1.10, datetime64 хранится внутри UTC и печатается как локальное время. Парсинг принимает локальное время, если TZ не задано, в противном случае учитывается смещение часового пояса.

  • в numpy >= 1.11, datetime64 хранится внутри как агностическое значение часового пояса (секунды с 1970-01-01 00:00 в неопределенном часовом поясе) и напечатано как таковое. Разбор времени не предполагает часовой пояс, хотя изменение времени часовой стрелки +NNNN по-прежнему разрешено и что значение преобразуется в UTC.

[1]: https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/datetime.c см. подпрограмму convert_datetime_to_pyobject.

Ответ 5

Вы можете использовать функцию Numpy datetime_as_string. Аргумент unit='D' указывает точность, в данном случае дней.

 >>> t = numpy.datetime64('2012-06-30T20:00:00.000000000-0400')
 >>> numpyp.datetime_as_string(t, unit='D')
'2012-07-01'