Pandas:tz_convert使用apply返回对象而不是datetime

时间:2018-05-15 21:06:18

标签: pandas datetime timestamp

我有一个以UTC格式的时间戳索引的数据框,以及指定时区和夏令时偏移量的两列,以分钟为单位的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,从而无法应用时区。

有没有办法在保留tz信息的同时将其转换回dt?

2 个答案:

答案 0 :(得分:2)

我今天在完全相同的情况下遇到了同样的问题。

通过将调用与dt.tz_localize(tz = None)链接到tz_convert来找到工作方法。

# function to apply
def tz_func(x):
    return x.dt.tz_convert(x.name).dt.tz_localize(tz=None)
# group by timezone and transform with function
r_df.groupby("time_zone")["END_DATE"].transform(tz_func)

然后,所得的系列将是日期时间类型,而不是对象,因为具有本地化日期会生成类型为“对象”的pd.Series。

答案 1 :(得分:1)

我偶然发现了一个相同的问题,并将其报告给Pandas社区,后者将我重定向到涉及相同问题的一个较旧的问题。遗憾的是,该问题仍然没有解决方案,但是如果您想跟踪问题,可以签出:

  1. The issue I reported.
  2. The issue I was redirected to.