我有一个以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?
答案 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社区,后者将我重定向到涉及相同问题的一个较旧的问题。遗憾的是,该问题仍然没有解决方案,但是如果您想跟踪问题,可以签出: