Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 夏令时转换在错误的时间_Python_Pytz - Fatal编程技术网

Python 夏令时转换在错误的时间

Python 夏令时转换在错误的时间,python,pytz,Python,Pytz,我有一个没有时区信息的日期列表,但是我知道时区和它们是本地时间的事实。我想转换为标准时间,以便执行时区分析 在悉尼夏令时结束于美国夏令时凌晨3点,因此前5行应为美国夏令时+11:00,其余为标准时间+10:00。我得到的结果是第一行为标准时间+11:00,其余为标准时间+10:00 有没有一种内置的方法来定位日期列表,因为我知道它们是经过排序的。为了处理重叠,您似乎需要知道isdst=True还是isdst=False 问候 戴夫 timezone.localize的参数默认为False。它用于

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

在悉尼夏令时结束于美国夏令时凌晨3点,因此前5行应为美国夏令时+11:00,其余为标准时间+10:00。我得到的结果是第一行为标准时间+11:00,其余为标准时间+10:00

有没有一种内置的方法来定位日期列表,因为我知道它们是经过排序的。为了处理重叠,您似乎需要知道isdst=True还是isdst=False

问候 戴夫

timezone.localize的参数默认为False。它用于不明确或不存在的输入日期。在这种情况下,可以将其设置为“无”以引发异常

为什么仅仅因为列表中的索引对于datetime2013,4,7,2是不同的,您希望得到不同的结果


除非明确提供is_dst参数,否则pytz无法确定datetime2013,4,7,2是什么时间。

这是我提出的解决方案,数据已排序,因此我第一次遇到is_dst=True,第二次遇到不明确时间时设置为False。此外,如果遇到不存在的时间,我将重置

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)

你看过datetime.isoformat吗?这可能对你有帮助。不,我查一下。我已经意识到,在我到达凌晨2:00的第二个实例之前,我可以通过传递isdst=True来实现我想要的,因此我创建了一个工作区,在这里我可以循环查看日期。我第一次遇到我设置的日期是_dst=True,第二次是False。嗨,对不起,问题不太清楚,我知道结果不会根据索引改变,我想问的是,是否有一种内置的方法来定位一系列按顺序排列的日期,或者我必须手动执行。@user2981639:通常没有内置的方法,否则就不需要传递is_dst参数,它将自动计算。假设列表中的所有值都产生模糊性错误,在这种情况下,您希望得到什么结果?当然,如果不是任意的日期列表,那么可能会有一个特定的解决方案。是的,我意识到了这一点,我的数据通常以15或30分钟的固定间隔进行排序
>>> 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
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)