如何基于DataFrame列逐行应用tz_localize及反向时区转换?
问题描述
现有如下结构的DataFrame:
import numpy as np import pandas as pd df = pd.DataFrame( dict( time=pd.DatetimeIndex([ '2018-10-28 01:30:00', '2018-10-28 02:00:00', '2018-10-28 02:30:00', '2018-10-28 02:00:00', '2018-10-28 02:30:00', '2018-10-28 03:00:00', '2018-10-28 03:30:00']), zone=np.random.choice(['Europe/Madrid', 'Europe/London', 'Europe/Paris'], 7) ) )
尝试用以下代码逐行应用tz_localize:
df.assign( time_localized=df.time.dt.tz_localize(df["zone"]) )
但触发报错:
TypeError: <class 'pandas.core.series.Series'>
需要解决两个问题:
- 如何实现逐行对
time列应用对应zone的tz_localize - 反向操作:将UTC时间转换为各行对应的时区时间
解决方案
一、逐行应用tz_localize(本地时间转带时区时间)
dt.tz_localize是针对整列DatetimeIndex的批量方法,不支持直接传入Series作为时区参数。要实现逐行匹配时区处理,用apply遍历每一行即可:
df['time_localized'] = df.apply( lambda row: row['time'].tz_localize(row['zone'], ambiguous='infer'), axis=1 )
- 参数
ambiguous='infer'用于处理夏令时切换导致的模糊时间(比如重复或缺失的时间点),可根据需求改为True/False或NaT来处理这类场景。
二、反向操作:UTC时间转对应时区本地时间
如果time列存储的是UTC时间,要转换为各行zone对应的本地时间,分两步操作:
- 先给UTC时间打上UTC时区标记
- 再转换到目标时区
用apply逐行处理的代码如下:
# 第一步:给原始时间打上UTC时区标记 df['time_utc'] = df['time'].dt.tz_localize('UTC') # 第二步:转换为对应时区的本地时间 df['time_in_zone'] = df.apply( lambda row: row['time_utc'].tz_convert(row['zone']), axis=1 )
如果原始time列已经是带UTC时区的DatetimeIndex,可以直接跳过第一步,直接用tz_convert转换。
内容的提问来源于stack exchange,提问作者David Masip
相关产品推荐
相关产品推荐

