У меня есть датафрейм, индексированный по временным меткам в UTC, а также 2 столбца, указывающие часовой пояс и смещения для перехода на летнее время в минутах от UTC:
time_zone daylight_saving
END_DATE
2017-06-02 00:00:00+00:00 0 60
2017-06-02 01:00:00+00:00 0 60
2017-06-02 02:00:00+00:00 0 60
2017-06-02 03:00:00+00:00 0 60
2017-06-02 04:00:00+00:00 0 60
Я пытаюсь преобразовать временные метки в локальныечасовой пояс с помощью pytz.FixedOffset.Использование статического смещения работает нормально, я получаю дату и время с соответствующим часовым поясом:
In [51]: df.tz_convert(pytz.FixedOffset(120))[['time_zone','daylight_saving']].head()
Out[51]:
time_zone daylight_saving
END_DATE
2017-06-02 02:00:00+02:00 0 60
2017-06-02 03:00:00+02:00 0 60
2017-06-02 04:00:00+02:00 0 60
2017-06-02 05:00:00+02:00 0 60
2017-06-02 06:00:00+02:00 0 60
In [52]: df.tz_convert(pytz.FixedOffset(120))[['time_zone','daylight_saving']].head().index
Out[52]:
DatetimeIndex(['2017-06-02 02:00:00+02:00', '2017-06-02 03:00:00+02:00',
'2017-06-02 04:00:00+02:00', '2017-06-02 05:00:00+02:00',
'2017-06-02 06:00:00+02:00'],
dtype='datetime64[ns, pytz.FixedOffset(120)]', name='END_DATE', freq=None)
Для того, чтобы сделать это с помощью столбцов смещения, мне нужно использовать метод apply:
In [63]: r_df.apply(lambda r:
r['END_DATE'].tz_convert(pytz.FixedOffset(r['time_zone'] +
r['daylight_saving'])), axis=1).head()
Out[63]:
0 2017-06-02 01:00:00+01:00
1 2017-06-02 02:00:00+01:00
2 2017-06-02 03:00:00+01:00
3 2017-06-02 04:00:00+01:00
4 2017-06-02 05:00:00+01:00
dtype: object
Как вы можете видеть в выводе, это возвращает серию объектов, а не серию даты-времени, как я ожидал.
Если я пытаюсь преобразовать его обратно, используя pd.to_datetime, я вынужден вернуть егов UTC, победив цель применения часового пояса.
Есть ли способ преобразовать это обратно в dt, сохранив информацию tz?