You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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对应的本地时间,分两步操作:

  1. 先给UTC时间打上UTC时区标记
  2. 再转换到目标时区

用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:54:25