如何在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
相关产品推荐
相关产品推荐

