2017-02-22 6 views
1

Почему этот «питонический» код не работает на линии 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 

Я ищу некоторый код, который красивее, чем следующий код (который работает отлично кстати):

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) 

Demo

>>> 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 
Смежные вопросы