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

如何在Python中将含GMT/BST的多时区日期列转换为UTC

问题分析与解决

为啥BST转换会报错

Python标准库的datetime.strptime里,%Z格式符对时区缩写的支持很有限——它依赖系统底层的时区数据识别,像BST(英国夏令时)这种地区性夏令时缩写,默认不在识别列表里;而GMT是通用时区缩写,所以能正常解析。

解决方案

方法1:手动替换时区缩写,用zoneinfo处理(Python 3.9及以上可用)

先把BST换成标准时区标识符Europe/London,GMT换成UTC,再用zoneinfo解析成带时区的时间对象,最后转成UTC并格式化输出。

代码示例:

from datetime import datetime
from zoneinfo import ZoneInfo

def parse_datetime(dt_str):
    # 替换时区缩写为标准标识符
    if 'BST' in dt_str:
        tz_str = 'Europe/London'
        fmt = '%a %d %b %Y %I:%M:%S %p BST'
    elif 'GMT' in dt_str:
        tz_str = 'UTC'
        fmt = '%a %d %b %Y %I:%M:%S %p GMT'
    else:
        raise ValueError("不支持的时区格式")
    
    # 解析时间并绑定时区
    dt = datetime.strptime(dt_str, fmt).replace(tzinfo=ZoneInfo(tz_str))
    # 转成UTC时间
    dt_utc = dt.astimezone(ZoneInfo('UTC'))
    # 输出目标格式
    return dt_utc.strftime('%Y-%m-%d %H:%M:%S')

# 测试GMT时间
print(parse_datetime('Sun 27 Mar 2022 12:59:03 AM GMT'))
# 测试BST时间
print(parse_datetime('Sun 27 Mar 2022 02:00:02 AM BST'))

运行结果:

2022-03-27 00:59:03
2022-03-27 01:00:02

方法2:用dateutil.parser自动解析(更省心)

python-dateutil库的解析器能自动识别大部分时区缩写,包括BST,不用手动写格式字符串。

先安装库:

pip install python-dateutil

代码示例:

from dateutil import parser
from datetime import datetime

def parse_datetime(dt_str):
    # 自动解析带时区的时间
    dt = parser.parse(dt_str)
    # 转成UTC时区
    dt_utc = dt.astimezone(datetime.timezone.utc)
    # 格式化输出
    return dt_utc.strftime('%Y-%m-%d %H:%M:%S')

# 测试GMT时间
print(parse_datetime('Sun 27 Mar 2022 12:59:03 AM GMT'))
# 测试BST时间
print(parse_datetime('Sun 27 Mar 2022 02:00:02 AM BST'))

运行结果:

2022-03-27 00:59:03
2022-03-27 01:00:02

批量处理数据集(以pandas为例)

如果用pandas处理整列数据,直接用apply批量转换即可:

import pandas as pd
from dateutil import parser
from datetime import datetime

# 构造测试数据集
df = pd.DataFrame({'date_time': [
    'Sun 27 Mar 2022 12:59:03 AM GMT',
    'Sun 27 Mar 2022 02:00:02 AM BST'
]})

# 定义转换函数
def convert_to_utc(dt_str):
    dt = parser.parse(dt_str)
    return dt.astimezone(datetime.timezone.utc).strftime('%Y-%m-%d %H:%M:%S')

# 批量转换
df['utc_datetime'] = df['date_time'].apply(convert_to_utc)
print(df)

运行结果:

date_time        utc_datetime
0  Sun 27 Mar 2022 12:59:03 AM GMT  2022-03-27 00:59:03
1  Sun 27 Mar 2022 02:00:02 AM BST  2022-03-27 01:00:02

内容的提问来源于stack exchange,提问作者U108456

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:34:36