基于Pandas中的列本地化时区

nlejzf6q  于 2023-02-07  发布在  其他
关注(0)|答案(1)|浏览(94)

我正尝试根据另一个包含时区的列将时区设置到datetime列。
示例数据:

DATETIME                VALUE          TIME_ZONE
0   2021-05-01 00:00:00    1.00      Europe/Athens
1   2021-05-01 00:00:00    2.13      Europe/London
2   2021-05-01 00:00:00    5.13      Europe/London
3   2021-05-01 01:00:00    4.25      Europe/Dublin
4   2021-05-01 01:00:00    4.25       Europe/Paris

我试图给DATETIME列分配一个时区,但是使用tz_localize方法时,我无法避免使用apply调用,这在我的大型数据集上会非常慢。有没有什么方法可以不使用apply来完成这个任务?
我现在拥有的(这是缓慢的):

df['DATETIME_WITH_TZ'] = df.apply(lambda row: row['DATETIME'].tz_localize(row['TIME_ZONE']), axis=1)
5hcedyr0

5hcedyr01#

我不确定,但在您的情况下,listcomp 似乎比apply快17倍:

df["DATETIME_WITH_TZ"] = [dt.tz_localize(tz)
                          for dt,tz in zip(df["DATETIME"], df["TIME_ZONE"])]

另一个变体,使用tz_convert

df["DATETIME_WITH_TZ"] = [dt.tz_localize("UTC").tz_convert(tz)
                          for dt,tz in zip(df["DATETIME"], df["TIME_ZONE"])]

时间:

#%%timeit #listcomp1
47.4 µs ± 1.32 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

#%%timeit #listcomp2
25.7 µs ± 1.94 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

#%%timeit #apply
457 µs ± 16.9 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

输出:

print(df)
             DATETIME  VALUE      TIME_ZONE           DATETIME_WITH_TZ
0 2021-05-01 00:00:00   1.00  Europe/Athens  2021-05-01 03:00:00+03:00
1 2021-05-01 00:00:00   2.13  Europe/London  2021-05-01 01:00:00+01:00
2 2021-05-01 00:00:00   5.13  Europe/London  2021-05-01 01:00:00+01:00
3 2021-05-01 01:00:00   4.25  Europe/Dublin  2021-05-01 02:00:00+01:00
4 2021-05-01 01:00:00   4.25   Europe/Paris  2021-05-01 03:00:00+02:00

相关问题