Почему преобразование из np.datetime64 в float и обратно приводит к разнице во времени? - PullRequest
0 голосов
/ 22 января 2019

С помощью следующего кода я получаю двухчасовую разницу после преобразования обратно в np.datetime64.

Как мне избежать этого?(если это будет тема: я сейчас в Центральной Европе)

import pandas as pd
import numpy as np
import datetime

a = np.datetime64('2018-04-01T15:30:00').astype("float")
a
b = np.datetime64(datetime.datetime.fromtimestamp(a))
b

Out[18]: numpy.datetime64('2018-04-01T17:30:00.000000')

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Возвращаясь к некоторым моим заметкам, я обнаружил следующее:

import numpy
dt64 = numpy.datetime64( "2011-11-11 14:23:56" )

# dt64 is internally just some sort of int
#      it has no fields, and very little support in numpy

import datetime, time
dtdt = dt64.astype(datetime.datetime)         # <<<<<<<< use this!
dtdt.year
dtdt.month
dtdt.day

# to convert back:
dt64 = np.datetime64(dtdt)                    # <<<<<<<< use this too!
dt64.item().strftime("%Y%b%d")

Модули datetime и time - это обычные модули Python: они работают разумнону, есть много полей, преобразований и поддержки.

datetime64 - это не полностью реализованный подтип, встроенный в numpy .Это просто 64-битный тип int (?) (Возможно, с 1970 года?). datetime64 - это нечто совершенно отличное от datetime.datetime .Если вы конвертируете datetime64 в число с плавающей запятой и обратно, вы теряете много точности (бит) - отсюда и ошибки.

Модуль (не является частью numpy) datetime также может делать такие вещи, как:

# timedelta()
delta = datetime.timedelta(days=11, hours=10, minutes=9, seconds=8)

delta                   # datetime.timedelta(11, 36548)     # (days,seconds)
delta.days
delta.seconds
delta.microseconds
delta.total_seconds()   # 986948.0

# arithmetic: +-*/
#   2 timedelta's
#   timedelta and datetime
now = datetime.datetime.now()
christmas = datetime.datetime(2019,12,25)
delta = christmas - now

Так что пусть numpy иногда сохраняет ваши данные даты как datetime64, но я бы порекомендовал not- numpy модуль datetime для работы с datetime-арифметикой.

0 голосов
/ 22 января 2019

Проблема не в преобразовании np.datetime64, а в datetime.datetime.fromtimestamp.

Поскольку Numpy 1.11 , np.datetime64 является наивным часового пояса. Он больше не предполагает, что ввод осуществляется по местному времени, и не печатает локальное время.

Однако datetime.datetime.fromtimestamp предполагает местное время. Из документов :

Возвращает локальную дату и время, соответствующие метке времени POSIX, например, которое возвращается функцией time.time (). Если необязательный аргумент tz равен None или не указан, отметка времени преобразуется в локальные дату и время платформы, а возвращаемый объект datetime является наивным.

Вы можете использовать datetime.datetime.utcfromtimestamp вместо:

>>> a = np.datetime64('2018-04-01T15:30:00').astype("float")
>>> np.datetime64(datetime.datetime.utcfromtimestamp(a))
numpy.datetime64('2018-04-01T15:30:00.000000')
0 голосов
/ 22 января 2019

https://github.com/numpy/numpy/issues/3290

По состоянию на 1.7 datetime64 пытается обрабатывать часовые пояса с помощью:

  • Предполагая, что все объекты datetime64 находятся в UTC
  • Применение смещений часовых поясов при разборе строк ISO 8601
  • Применение смещения часового пояса Locale, когда в строке ISO не указан TZ.
  • Применение смещения часового пояса Locale при печати и т. Д.

https://stackoverflow.com/a/18817656/7583612

classmethod datetime.fromtimestamp (отметка времени, tz = нет)

Возвращает локальную дату и время, соответствующие метке времени POSIX, такой как возвращается time.time (). Если необязательный аргумент tz равен None или не указано, временная метка преобразуется в локальную дату платформы и время, и возвращенный объект даты и времени наивен.

Иначе tz должен быть экземпляром подкласса класса tzinfo, а временная метка преобразуется в часовой пояс tz‘. В этом случае результат эквивалентно tz.fromutc (datetime.utcfromtimestamp (метка времени) .Надеть (tzinfo = TZ)) * +1026 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...