夏令时在错误的时间过渡

时间:2013-12-10 03:14:57

标签: python pytz

我有一个没有时区信息的日期列表,但是我知道时区以及它们是当地时间的事实。我想转换为标准时间以执行时区分析

在悉尼,夏令时在美国夏令时凌晨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)

2 个答案:

答案 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)