2017-02-22 31 views
1

爲什麼這個「pythonic」代碼在tz_localize()行上不起作用?如何正確設置pandas tz_localize?

import pandas as pd 

df = pd.DataFrame([{ "Localtime":"2016-01-01 12:00:00", "Timezone":"Europe/London" }, 
        { "Localtime":"2016-01-01 12:00:00", "Timezone":"Europe/Paris" }]) 

df['UtcDateTime'] = pd.to_datetime(df['Localtime']).tz_localize(df['Timezone']) 
df 

我找的一些代碼,比下面的代碼更漂亮(其中細BTW工作):

import pandas as pd 

df = pd.DataFrame([{ "Localtime":"2016-01-01 12:00:00", "Timezone":"Europe/London" }, 
        { "Localtime":"2016-01-01 12:00:00", "Timezone":"Europe/Paris" }]) 

df['UtcDateTime'] = 'NA' 
i=0 
for ts in df.Localtime: 
    ts1 = pd.to_datetime(ts).tz_localize(df.Timezone[i]) 
    df['UtcDateTime'][i] = ts1 
    i=i+1 
df 

預期結果:

Localtime   Timezone  UtcDateTime 
0 2016-01-01 12:00:00 Europe/London 2016-01-01 12:00:00+00:00 
1 2016-01-01 12:00:00 Europe/Paris 2016-01-01 12:00:00+01:00 

回答

2

你可能只想選擇對於apply

df.apply(lambda x: pd.to_datetime(x.Localtime).tz_localize(x.Timezone), axis=1) 

演示

>>> df['UtcDateTime'] = df.apply(lambda x: pd.to_datetime(x.Localtime).tz_localize(x.Timezone), axis=1) 

>>> df 
      Localtime  Timezone    UtcDateTime 
0 2016-01-01 12:00:00 Europe/London 2016-01-01 12:00:00+00:00 
1 2016-01-01 12:00:00 Europe/Paris 2016-01-01 12:00:00+01:00 

之所以你的短方法是行不通的,確實tz_localize需要指數時,沒有價值觀行事。我建議你將它轉換爲DatetimeIndex,類似於pd.DatetimeIndex, 然而,tz_localize只接受一個時區,所以最終你會最終應用行。

1

您的代碼無效,因爲tz_localize()預計會將單個時區應用於系列中的多個值。爲了使你的循環一點清潔劑,可以使用apply()爲:

代碼:

def localize_ts(row): 
    return pd.to_datetime(row['Localtime']).tz_localize(row['Timezone']) 

df['UtcDateTime'] = df.apply(localize_ts, axis=1) 

產地:

   Localtime  Timezone    UtcDateTime 
0 2016-01-01 12:00:00 Europe/London 2016-01-01 12:00:00+00:00 
1 2016-01-01 12:00:00 Europe/Paris 2016-01-01 12:00:00+01:00