Панды: tz_convert с использованием apply возвращает объект, а не datetime - PullRequest
0 голосов
/ 16 мая 2018

У меня есть датафрейм, индексированный по временным меткам в 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?

1 Ответ

0 голосов
/ 11 апреля 2019

Я наткнулся на ту же проблему и сообщил об этом сообществу Pandas, которое перенаправило меня к более старой проблеме, ссылающейся на ту же проблему. К сожалению, до сих пор нет решения этой проблемы, но если вы хотите отслеживать проблему, вы можете проверить:

  1. Проблема, о которой я сообщил.
  2. Проблема, на которую я был перенаправлен.
...