Как заставить Python печатать NumPy DateTime64 с указанным часовым поясом?

Я хочу видеть numy объекты datetime64 по указанному мне часовому поясу.

>>> import numpy as np
>>> np.datetime64('2013-03-10T01:30:54')
numpy.datetime64('2013-03-10T01:30:54+0400')
>>> np.datetime64('2013-03-10T01:30:54+0300')
numpy.datetime64('2013-03-10T02:30:54+0400')

Python печатает объекты даты и времени всегда в формате UTC+0400 (это мой местный часовой пояс), даже если я указываю другой часовой пояс >>> np.datetime64('2013-03-10T01:30:54+0300'), Есть ли способ принудительной печати Python по часовому поясу UTC+0000?

Я использую NumPy 1.8.1 .

3 ответа

Решение

Упоминается несколько раз в документации NumPy:

Объект datetime представляет один момент времени.

...

Datetime всегда хранится в зависимости от времени POSIX...

Таким образом, внутренне datetime64 отслеживает одно целое число, которое представляет момент времени в качестве значения с эпохи UNIX (1970-01-01) - не считая високосных секунд.

Поэтому часовые пояса не сохраняются. Если вы передадите смещение часового пояса, оно будет применяться для определения правильного времени UTC. Если вы не пропустите один, он будет использовать часовой пояс локального компьютера. Независимо от ввода, на выходе он использует часовой пояс локального компьютера, чтобы проецировать время UTC на местное время со смещением.

Есть ли способ принудительной печати Python по часовому поясу UTC+0000?

Вы могли бы позвонить .item() это возвращает наивный datetime объект, который представляет время в UTC для данных в вашем примере:

>>> import numpy
>>> numpy.__version__
'1.8.1'
>>> dt = numpy.datetime64('2013-03-10T01:30:54+0300')
>>> dt
numpy.datetime64('2013-03-10T02:30:54+0400')
>>> dt.item()
datetime.datetime(2013, 3, 9, 22, 30, 54)
>>> print(dt.item())
2013-03-09 22:30:54

Вы всегда можете установить часовой пояс перед печатью datetime64 объекты:

>>> import os, time, numpy
>>> os.environ['TZ'] = 'GMT'
>>> time.tzset()

>>> numpy.datetime64(0, 's')
numpy.datetime64('1970-01-01T00:00:00+0000')
Другие вопросы по тегам