Надежное преобразование данных из EST (летнее время) в стандартное время Японии (без перехода на летнее время) - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть то, что я считаю простой проблемой, но она становится все более запутанной, когда я читаю больше и просматриваю вопросы на этом форуме. Я прошу прощения, если это было задано ранее, но до сих пор я не смог найти источник, который обрабатывает оба упомянутых ниже шага вместе.

Проблема: у меня есть кадр данных с таким временем (без упоминания часового пояса или смещение)

Date Time 
2020-01-02 22:00:00
2020-01-03 01:00:00 
2002-01-03 01:05:00  

и так далее. Эти времена в EST. EST следует за летним временем

Мне нужно преобразовать это в стандартное время Японии, которое не следует за летним временем

Итак, сначала мне нужно преобразовать время 2020-01-02 22:00 : 00 в EST объект даты и времени. Я собирался использовать datetime.strptime , но я не знаю, куда поместить часовой пояс.

Далее мне нужно преобразовать объект EST datetime в стандартное время Японии. Но я не уверен, будет ли python автоматически вычисляться, когда начнется переход на летнее время в часовом поясе EST США. В прошлом Конгресс США внес некоторые изменения, и как Python узнает об этом. Точно так же, если в будущем Конгресс США внесет некоторые изменения, например, они устранят переход на летнее время, мы сможем сохранить тот же код, просто обновив подпрограммы python для часового пояса.

Спасибо за любые входные данные

1 Ответ

1 голос
/ 06 февраля 2020

Если вы предполагаете, что значением вашего информационного кадра является наивный часовой пояс, то есть дата / время без часового пояса, вам нужно присоединить часовой пояс EST к DST с помощью tz_localize('EST', ambiguous='infer'), а затем использовать tz_convert('Asia/Tokyo'), чтобы изменить правильное время для Японии.

Без указания c информация о том, для какого города эти данные, может быть невозможно определить, действует ли DST. Согласно https://www.timeanddate.com/time/zone/usa/new-york, Нью-Йорк - EST до 2020-05-07, а затем будет в EDT UT C -04: 00 до 31 октября.

см. https://pandas.pydata.org/docs/reference/api/pandas.DatetimeIndex.tz_localize.html#pandas -datetimeindex-tz-localize для получения дополнительной информации о летнем времени

В некоторых случаях вывести DST невозможно. В таких случаях вы можете передать ndarray неоднозначному параметру для явной установки DST

...

s.dt.tz_localize('CET', ambiguous=np.array([True, True, False]))

Я начинаю с строковые значения

# just str, not a datetime index
>>> df.info()                                                                                                                                                            
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 1 columns):
Datetime    3 non-null object
dtypes: object(1)
memory usage: 152.0+ bytes

# convert to datetime
>>> tz_naive = pd.to_datetime(df['Datetime'])
>>> tz_naive
0   2020-01-02 22:00:00
1   2020-01-03 01:00:00
2   2002-01-03 01:05:00
Name: Datetime, dtype: datetime64[ns]

>>> tz_aware = tz_naive.dt.tz_localize('EST', ambiguous='infer')
>>> tz_aware                                                                                                                                                              
0   2020-01-02 22:00:00-05:00
1   2020-01-03 01:00:00-05:00
2   2002-01-03 01:05:00-05:00
Name: Datetime, dtype: datetime64[ns, EST]

>>> tz_aware.dt.tz_convert('Asia/Tokyo')
0   2020-01-03 12:00:00+09:00
1   2020-01-03 15:00:00+09:00
2   2002-01-03 15:05:00+09:00
Name: Datetime, dtype: datetime64[ns, Asia/Tokyo]
...