что означает -753 с точки зрения часового пояса в `pd.Timestamp` - PullRequest
0 голосов
/ 10 мая 2019
tz = pytz.timezone('America/Los_Angeles')
t1 = pd.Timestamp(datetime.datetime(2019, 2, 6, 17, 0, 0, tzinfo=tz))
t1

Выход:

Timestamp('2019-02-06 17:00:00-0753', tz='America/Los_Angeles')

Почему -0753?

Обновление : После некоторых исследований, этот способ, кажется, работает: Я мог бы делать это неправильно, см. Ниже

tz = pytz.timezone('America/Los_Angeles')
t1 = datetime.datetime(2019, 2, 6, 17, 0, 0)
t1 = tz.localize(t1)
t1 = pd.Timestamp(t1)
t1

Выход:

Timestamp('2019-02-06 17:00:00-0800', tz='America/Los_Angeles')

Какой объект должен быть tzinfo при передаче на datetime.datetime тогда?

1 Ответ

1 голос
/ 10 мая 2019

Я не знаю почему, но это странное смещение часового пояса происходит от pytz. Смотрите код ниже:

>>>print(datetime(2019, 5, 10, tzinfo=pytz.timezone('America/Los_Angeles')))
2019-05-10 00:00:00-07:53

>>>print(pytz.timezone('America/Los_Angeles').localize(datetime(2019, 5, 10)))
2019-05-10 00:00:00-07:00

Итак, если вы пытаетесь создать дату и время и укажите tzinfo, это создаст это смещение.

Upd.

Я проверил pytz docs и нашел следующее:

К сожалению, использование аргумента tzinfo стандартных конструкторов даты и времени "не работает" с pytz для многих часовых поясов.

...

Это безопасно для часовых поясов без переходов на летнее время, таких как UTC.

Хорошо, они говорят это, но не указывают на причину. Давайте попробуем найти это. В источниках pytz я нашел версию базы данных IANA , которую они используют:

OLSON_VERSION = '2019a'

После скачивания и распаковки этой базы данных в файле "northamerica" ​​я нашел следующее:

# Zone  NAME        GMTOFF  RULES   FORMAT  [UNTIL]
Zone America/Los_Angeles -7:52:58 - LMT 1883 Nov 18 12:07:02
            -8:00   US  P%sT    1946
            -8:00   CA  P%sT    1967
            -8:00   US  P%sT

-7:52:58 довольно близко к -07:53 у нас.

Вывод: Где-то в pytz есть база данных, которая содержит все известные смещения часовых поясов. Когда мы передаем tzinfo в конструктор datetime, он получает первый известный часовой пояс и использует его, когда метод локализации, который вызывает replace () и передает tzinfo, каким-то образом получает правильное смещение часового пояса.

Чтобы проверить это, я нашел в том же файле другой часовой пояс:

# Zone  NAME        GMTOFF  RULES   FORMAT  [UNTIL]
Zone America/Toronto    -5:17:32 -  LMT 1895
            -5:00   Canada  E%sT    1919
            -5:00   Toronto E%sT    1942 Feb  9  2:00s
            -5:00   Canada  E%sT    1946
            -5:00   Toronto E%sT    1974
            -5:00   Canada  E%sT

А потом я запустил следующий код:

>>>print(datetime(2019, 5, 10, tzinfo=pytz.timezone('America/Toronto')))
2019-05-10 00:00:00-05:18

Как видите, результат тот же. Он использовал -5:17:32, который является первым смещением от списка.

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