如何比较python中的两个时区?

时间:2014-06-17 14:08:02

标签: python pandas timezone

实施例

 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'进入欧洲/罗马'使用答案的反馈

确保示例中的时区相同

3 个答案:

答案 0 :(得分:4)

他们代表同样的事情。

  • "CET" 始终 UTC + 01:00

  • "Europe/Berlin"在冬季的CET(UTC + 01:00)和夏季的CEST(UTC + 02:00)之间轮流进行。

另见:

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

如果您比较他们的定义(使用前一段中的链接),您会看到这些定义与" EU" CET / CEST的规则在他们过去的某个时刻。自1980年以来的罗马和柏林,自1981年以来的苏黎世,以及自1977年以来的阿姆斯特丹。其他时区也有不同的规则。

如果您对这些区域的历史感兴趣,建议您阅读TZ数据中的europe file。仅这些评论非常有趣。

另一方面,如果您只使用现代日期,所有区域遵循相同的规则和抵消,那么您可以考虑这些可替代 - 至少只要它们未来不会发生变化

此外, 某些时区只是别名并且完全可以互换。在TZ数据中,他们称之为"链接"。例如,您可以看到here Europe/VaticanEurope/San_Marino都与Europe/Rome相关联,因此是{{3}}。

答案 1 :(得分:3)

这是一种贫民窟,但我可以将两个时区的偏移与给定的时间戳进行比较。

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

答案 2 :(得分:1)

如果不想转换的唯一原因是效率低下,我会质疑这是否真的有必要。 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