我有一个没有时区信息的日期列表,但是我知道时区以及它们是当地时间的事实。我想转换为标准时间以执行时区分析
在悉尼,夏令时在美国夏令时凌晨3点结束,因此前5行应该是+11:00 DST,其余是+10:00 STD。我得到的结果是第一行是+11:00 DST,剩下的是+10:00 STD。
是否存在本地化日期列表的内置方式,因为我知道它们已经排序。看来你应该知道is_dst = True或is_dst = False是为了处理重叠。
此致 戴夫
import pytz
times = [
datetime(2013,4,7,1,45,0)
,datetime(2013,4,7,2,0,0)
,datetime(2013,4,7,2,15,0)
,datetime(2013,4,7,2,30,0)
,datetime(2013,4,7,2,45,0)
,datetime(2013,4,7,2,00,0)
,datetime(2013,4,7,2,15,0)
,datetime(2013,4,7,2,30,0)
]
#
timezone = pytz.timezone('Australia/Sydney')
localized = map(timezone.localize, times)
for t,l in zip(times, localized):
print(t,l)
答案 0 :(得分:0)
timezone.localize
的{{1}}参数默认为is_dst
。它用于模糊或不存在的输入日期。在这种情况下,您可以将其设置为False
以引发异常。
为什么您只希望获得不同的结果,因为列表中的索引与None
不同?
datetime(2013,4,7,2)
除非您明确提供>>> from datetime import datetime
>>> import pytz
>>> timezone = pytz.timezone('Australia/Sydney')
>>> timezone.localize(datetime(2013,4,7,2))
datetime.datetime(2013, 4, 7, 2, 0,
tzinfo=<DstTzInfo 'Australia/Sydney' EST+10:00:00 STD>)
>>> timezone.localize(datetime(2013,4,7,2), is_dst=False)
datetime.datetime(2013, 4, 7, 2, 0,
tzinfo=<DstTzInfo 'Australia/Sydney' EST+10:00:00 STD>)
>>> timezone.localize(datetime(2013,4,7,2), is_dst=True)
datetime.datetime(2013, 4, 7, 2, 0,
tzinfo=<DstTzInfo 'Australia/Sydney' EST+11:00:00 DST>)
>>> timezone.localize(datetime(2013,4,7,2), is_dst=None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/pytz/tzinfo.py", line 344, in localize
raise AmbiguousTimeError(dt)
pytz.exceptions.AmbiguousTimeError: 2013-04-07 02:00:00
参数,否则pytz无法找出is_dst
的时间。
答案 1 :(得分:0)
这是我提出的解决方案,数据已经排序,所以我设置is_dst = True第一次遇到时和模糊时间而False第二次。此外,如果遇到不存在的时间,我重置is_dst
seen = set()
get_datetime = operator.itemgetter('datetime')
for row in data:
dt = get_datetime(row)
try:
localized = timezone.localize(dt, is_dst=None)
except pytz.NonExistentTimeError:
localized = timezone.localize(dt, is_dst=True)
seen = set()
except pytz.AmbiguousTimeError:
localized = timezone.localize(dt, is_dst=(dt not in seen))
seen.add(dt)