Python 如何正确设置pandas tz_本地化?

Python 如何正确设置pandas tz_本地化?,python,pandas,Python,Pandas,为什么这个“pythonic”代码在tz\u 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

为什么这个“pythonic”代码在
tz\u 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
我正在寻找比以下代码更漂亮的代码(顺便说一句,它工作得很好):

预期结果:

    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

您可能只想选择使用

演示

>>> 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
只接受一个时区,因此您最终将应用于行。

您可能只需要选择使用

演示

>>> 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\u localize
只接受一个时区,因此您最终将应用于行。

您的代码不起作用,因为
tz\u 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
产生:

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

您的代码不起作用,因为
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
产生:

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