2016-04-04 24 views
1

Series.dt aracılığıyla erişilen bir serinin datetime özelliklerinde yapılan değişiklikler, diziye bir biçimlendirici uygularken görünmüyor, bu noktadan sonra utc'ye dönüşüyor?Pandalar: Series.dt'nin beklenmeyen davranışı

(görevi ingiliz yaz aylarında bir zaman serilerini göstermektir) Aşağıdaki kod örneği ele alalım:

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 

Çıktı:

enter image description here

"Dönüştürülen" serisi dt kullanarak rağmen .localise doğru yazdırır, dize biçiminde işleç biçimlendirilmiş olarak biçimlendirildiğinde, zamanların UTC zamanlarına dönmesine neden olur. Bunun, "pytz kullanma" sütunu gibi davranmasını ve sütun saatini yeni saat diliminde yerel saat olarak yayınlamasını bekledim. Bu bir hatadır mı yoksa bu tuhaflığın bir sebebi var mı? Daha da garibi

:

dt = df.iloc[3].get_value("Converted") 
print dt 
print convert_datetime(dt) 

doğru 04 yazdırır: 00 + 1: 00 ve 04:00 öyleyse neden farklı davranır geçerlidir Yoksa bu sadece bir hata olduğunu?

cevap

1

O

converted_series.dt.strftime(date_format_string) 

yapmak yerine hiç

bir çalışma çözüm series.dt.localize aracılığıyla edilir applyed saat dilimi özelliklerini kapalı şerit olacak uygulamak pandalar 18.0 itibarıyla bilinen bir hatadır çıkıyor strftime, datetime özelliklerinin doğru bir şekilde farkında olduğundan, kullanın.