Pandas:Series.dt

时间:2016-04-04 15:08:43

标签: python datetime pandas

为什么在将格式化程序应用到系列时,不会显示通过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

输出:

enter image description here

尽管使用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所以为什么应用表现不同或者这只是一个错误?

1 个答案:

答案 0 :(得分:1)

事实证明,这是一个已知的大熊猫18.0的bug,它将剥离通过series.dt.localize应用的时区属性

工作解决方案是

converted_series.dt.strftime(date_format_string) 

而不是使用apply,因为strftime正确地知道日期时间属性。