如何在python中比较两个时区



示例

 import pytz
 b=pytz.timezone('Europe/Rome')
 c=pytz.timezone('Europe/Berlin')

这两个时区有不同的名称,但代表相同的东西,然而

  • b==c返回false
  • b.zone不同于c.zone

有什么方法可以看出b实际上等于c吗?

具体的问题是,我必须转换熊猫数据帧的时区,但前提是该时区与c不同。原始时区可能是b,在这种情况下,我不想转换,因为将b转换为c会浪费时间(因为它们最后代表相同的时区…(

谢谢你的帮助。

更新:将"CET"更改为"欧洲/罗马",以确保示例中的时区相同,使用的反馈

它们不代表相同的东西。

  • "CET"总是UTC+01:00

  • "Europe/Berlin"在冬季的CET(UTC+01:00(和夏季的CEST(UTC+02:00(之间交替。

另请参阅:

  • 时区标记wiki,特别是"时区!=偏移量"部分
  • dst标签wiki-涵盖夏令时

关于编辑,Europe/Rome是一个不同的时区。它与Europe/BerlinEurope/ZurichEurope/Amsterdam不同。至少不是他们的整个历史。

如果你比较它们的定义(使用上一段中的链接(,你会发现它们在过去的某个时候都符合CET/CEST的"欧盟"规则。1980年起在罗马和柏林,1981年起在苏黎世,1977年起在阿姆斯特丹。在这些日期之前,它们有显著差异。其他时区也有不同的规则。

如果你对这些区域的历史感兴趣,我建议你仔细阅读TZ数据中的欧洲文件。单是评论就很有趣。

另一方面,如果你只使用现代日期,所有区域都遵循相同的规则和偏移量,那么你可以认为这些是可替代的——至少只要它们在未来不会改变。

此外,还有一些时区,它们只是别名,完全可以互换。在TZ数据中,它们被称为"链路"。例如,您可以在这里看到Europe/VaticanEurope/San_Marino都链接到Europe/Rome,因此是等价的。

这有点像贫民区,但我可以将两个时区的偏移量与给定的时间戳进行比较。

from datetime import datetime
today = datetime.today()
b.utcoffset(today) == c.utcoffset(today)

如果不想转换的唯一原因是效率低下,我会怀疑这是否真的有必要。Wes McKinney有一篇关于矢量化日期时间转换的好博客文章http://wesmckinney.com/blog/?p=506.例如,对于具有1e6行的系列

In [1]: from pandas import *
In [2]: import numpy as np
In [3]: rng = date_range('3/6/2012', periods=1000000, freq='s', tz='US/Eastern')
In [4]: ts = Series(np.random.randn(len(rng)),rng)
In [5]: %timeit ts.tz_convert('utc')
100 loops, best of 3: 2.17 ms per loop

相关内容

  • 没有找到相关文章

最新更新