Skip to main content
 首页 » 编程设计

python之如何正确设置 pandas tz_localize

2025年05月04日23sharpest

为什么这个“pythonic”代码在 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 

请您参考如下方法:

您的代码无法正常工作,因为 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