Ответ 1
Решение было:
import pandas as pd
ts = pd.to_datetime(str(date))
d = ts.strftime('%Y.%m.%d')
У меня возникла проблема с преобразованием объекта 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
Решение было:
import pandas as pd
ts = pd.to_datetime(str(date))
d = ts.strftime('%Y.%m.%d')
Если вы не хотите делать это преобразование gobbledygook и поддерживаете только один формат даты, это было лучшим решением для меня
str(t)[:10]
Out[11]: '2012-07-01'
Мне нужна строка в формате 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"
Существует маршрут без использования 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
.
Вы можете использовать функцию 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'