为什么在将格式化程序应用到系列时,不会显示通过Series.dt访问的系列的日期时间属性的更改,此时它将全部恢复为utc?
考虑以下代码示例(其目的是显示英国夏令时的时间序列):
import pandas as pd
import logging
import pytz
from pytz import timezone
date_format_string = "%a %b %d %Y %H:%M"
def convert_datetime(x) :
return x.strftime(date_format_string)
def longer_convert(x, tz = timezone('Europe/London')) :
return convert_datetime(pytz.utc.localize(x).astimezone(tz))
if __name__=="__main__" :
rng = pd.date_range('6/6/2011', periods=6, freq='H')
rng2 = pd.date_range('6/6/2011', periods=6, freq='D')
series = pd.Series(data=rng, index=rng2)
series.name = "Original"
converted_series = series.dt.tz_localize('UTC').dt.tz_convert('Europe/London')
converted_series.name = "Converted"
formatted_series = converted_series.apply(convert_datetime)
formatted_series.name = "Formatted"
longer_converted = series.apply(longer_convert)
longer_converted.name = "Using pytz"
df=pd.concat([series,converted_series,formatted_series, longer_converted], axis=1)
print df
输出:
尽管使用dt.localise打印的系列“Converted”正确打印,但在Formatted中应用字符串格式运算符会导致时间恢复为UTC时间。我希望它的行为类似于“使用pytz”列,并在其新时区中将列格式输出为本地时间。这是一个错误还是有这种奇怪的原因?
更奇怪的是:
dt = df.iloc[3].get_value("Converted")
print dt
print convert_datetime(dt)
正确地打印04:00 + 1:00和04:00所以为什么应用表现不同或者这只是一个错误?
答案 0 :(得分:1)
事实证明,这是一个已知的大熊猫18.0的bug,它将剥离通过series.dt.localize应用的时区属性
工作解决方案是
converted_series.dt.strftime(date_format_string)
而不是使用apply,因为strftime正确地知道日期时间属性。