我的数据以格林威治标准时间(GMT)的时间戳存储:
import pandas as pd
import pytz
# data is stored in UTC
timestamp_utc = pd.Timestamp('2018-1-18 23:00', tz='Etc/GMT')
print(timestamp_utc)
2018-01-18 23:00:00+00:00
现在,我想在中欧时间(CET)中查看我的数据,该时间与格林尼治标准时间(GMT)固定为+1小时。
# Central European Time (CET)
cet_tz = pytz.timezone('Etc/GMT+1')
timestamp_cet = timestamp_utc.astimezone(cet_tz)
print(timestamp_cet)
2018-01-18 22:00:00-01:00
这对我来说很混乱,我本来以为2018-01-19 00:00:00+01:00
。
在documentation中,以下是固定偏移量:
固定偏移量
上述“ Etc / GMT *”时区提供固定的 偏移规格,但要注意反直觉的符号 惯例。
有人可以解释这是什么意思吗?真的是说,如果我想要Etc/GMT+1
,我必须做Etc/GMT-1
吗?
因为:
print(timestamp_utc.astimezone(pytz.timezone('Etc/GMT-1')))
产生预期结果:
2018-01-19 00:00:00+01:00
有人能解释这种违反直觉的行为的逻辑吗?
编辑
我认为我可以在中欧时间使用pytz.timezone('CET')
。但这对应于夏季(UTC+2:00
)夏令时期间的CEST,因此不适合用作真正的CET时区。此外,时区CET
也是deprecated。
因此,Etc/GMT-1
是代表真实中欧时间(UTC+01:00
)的规范方法。
答案 0 :(得分:1)
Etc/GMT*
区域旨在与POSIX兼容,以便与未安装完整时区数据库的系统上的TZ
环境变量向后兼容。 POSIX时区规则的偏移符号与我们通常期望的ISO 8601标准相反。
在评论in the tz database中对此进行了解释:
与区域名称中的POSIX TZ设置保持一致,即使这与许多人的预期相反。 POSIX在格林威治以西有积极的迹象,但是许多人期望格林威治以东有积极的迹象。例如,TZ ='Etc / GMT + 4'使用缩写“ -04”,对应于UT落后4小时(即格林威治以西),即使许多人希望它表示比UT提前4小时(即UT以东)。格林威治)。
on Wikipedia也有描述:
“ Etc”的特殊区域用于某些管理区域,尤其是代表协调世界时的“ Etc / UTC”。为了符合POSIX样式,以“ Etc / GMT”开头的区域名称的符号与标准ISO 8601约定相反。在“ Etc”区域中,格林尼治标准时间以西的区域带有正号,而东部地区则具有负号(例如,“ Etc / GMT-14”比格林尼治时间早14小时。)
通常,对于陆地上的居住位置,您应该优先使用基于位置的区域标识符。例如,在荷兰使用Europe/Amsterdam
作为时间。这样做的好处是可以在正确的时间点以及任何以前的历史过渡之间正确地在CET和CEST之间进行切换。
在边缘情况下(例如跟踪海上船只的时间)保留使用Etc/GMT*
区域。
您可以查看tzdb区域名称here的完整列表。