实施例
import pytz
b=pytz.timezone('Europe/Rome')
c=pytz.timezone('Europe/Berlin')
这两个时区有不同的名称但代表相同的东西,但是
有没有办法看到b实际上等于c?
具体的问题是我必须转换熊猫数据框的时区,但只有当这个区域不同于让我们说c时。原始时区可能是b,在这种情况下我不想转换,因为将b转换为c会丢失时间(因为它们代表最后的相同时区....)
感谢您的帮助。
更新: 改变了CET'进入欧洲/罗马'使用答案的反馈
确保示例中的时区相同答案 0 :(得分:4)
他们不代表同样的事情。
"CET"
始终 UTC + 01:00
"Europe/Berlin"
在冬季的CET(UTC + 01:00)和夏季的CEST(UTC + 02:00)之间轮流进行。
另见:
关于编辑,Europe/Rome
是一个不同的时区。它与Europe/Berlin
,Europe/Zurich
和Europe/Amsterdam
不同。至少不是因为他们的整个历史。
如果您比较他们的定义(使用前一段中的链接),您会看到这些定义与" EU" CET / CEST的规则在他们过去的某个时刻。自1980年以来的罗马和柏林,自1981年以来的苏黎世,以及自1977年以来的阿姆斯特丹。其他时区也有不同的规则。
如果您对这些区域的历史感兴趣,建议您阅读TZ数据中的europe file。仅这些评论非常有趣。
另一方面,如果您只使用现代日期,所有区域遵循相同的规则和抵消,那么您可以考虑这些可替代 - 至少只要它们未来不会发生变化
此外, 某些时区只是别名并且完全可以互换。在TZ数据中,他们称之为"链接"。例如,您可以看到here Europe/Vatican
和Europe/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