Pandas使用tz_convert转换时区时Etc/GMT+2与Africa/Maputo结果不一致问题
Pandas时区转换Etc/GMT与地区时区结果差异原因
核心原因:Etc/GMT系列时区偏移符号规则和常规认知相反
IANA时区数据库中的Etc/GMT±X系列遵循POSIX标准的偏移定义,和我们日常使用的GMT偏移符号完全相反:
- 日常认知的
GMT+2:表示比UTC快2小时,对应格林威治以东的时区 - POSIX标准的
Etc/GMT+2:表示比UTC慢2小时(UTC-2),对应格林威治以西的时区;Etc/GMT-2才对应比UTC快2小时的UTC+2时区
这就是你使用tz_convert('Etc/GMT+2')结果错误、用Etc/GMT-2结果正确的直接原因。
推荐优先使用地区时区标识符Africa/Maputo的原因
Etc/GMT±X属于固定偏移时区,不包含任何地区的时区政策变动(比如夏令时调整、官方时区变更)记录。而Africa/Maputo是对应莫桑比克的地区级时区标识符,内置了该地区所有历史时区规则:
- 你示例中2019年的时间,莫桑比克未实行夏令时,固定为UTC+2,所以
Africa/Maputo和Etc/GMT-2转换结果一致 - 如果处理莫桑比克1976-1982年实行夏令时的时间段数据,
Etc/GMT-2会得到错误结果,Africa/Maputo会自动适配当时的UTC+3夏令时偏移
示例代码验证
import pandas as pd import numpy as np np.random.seed(2019) N = 1000 rng = pd.date_range('2019-01-01', freq='10Min', periods=N) df = pd.DataFrame(np.random.rand(N, 3), columns=['temp','depth','acceleration'], index=rng) # 错误结果:实际转成了UTC-2 print(df.tz_localize('UTC').tz_convert('Etc/GMT+2')) # 正确结果:对应UTC+2 print(df.tz_localize('UTC').tz_convert('Etc/GMT-2')) # 正确结果:适配莫桑比克时区规则 print(df.tz_localize('UTC').tz_convert('Africa/Maputo'))
内容的提问来源于stack exchange,提问作者tull12 BULL12
相关产品推荐
相关产品推荐

