2017-02-22 125 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