2013-12-10 4 views
0

У меня есть список дат без информации о часовом поясе, однако я знаю часовой пояс и тот факт, что они являются локальными. Я хочу преобразовать в стандартное время, чтобы выполнить анализ часового пояса.Переход на летнее время в неправильное время

В Сиднее дневной свет заканчивается в 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

У вас есть взгляд на datetime.isoformat()? Это может помочь вам. –

+0

Нет, я проверю это. Я понял, что могу добиться того, чего хочу, передав is_dst = True до тех пор, пока не удару по второму экземпляру 2:00 утра, поэтому я создал обходной путь, где я просматриваю даты. В первый раз, когда я сталкиваюсь с датой, я устанавливаю is_dst = True, а второй - False. – user2981639

ответ

0

Это решение, с которым я пришел, данные отсортированы, поэтому я устанавливаю is_dst = True в первый раз, когда я сталкиваюсь и неоднозначно, и False the 2nd. Также, если встречается несуществующее время, я возвращаю 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) 
0

timezone.localize имеет 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 

Если вы не предоставите is_dst параметр явно не существует никакого способа для pytz, чтобы выяснить, что время datetime(2013,4,7,2).

+0

Привет, Извините, вопросы не так понятны, я понимаю, что результат не изменится в зависимости от индекса, я спрашиваю, есть ли встроенный способ локализации последовательности дат, которые упорядочены или мне нужно сделать это вручную. – user2981639

+0

@ user2981639: вообще нет встроенного способа, иначе не было бы необходимости передавать параметр 'is_dst' (он будет автоматически вычислен). Представьте, что все значения в вашем списке производят 'AmbiguousTimeError', какой результат вы ожидаете в этом случае? Если это не произвольный список дат, тогда может возникнуть конкретное решение – jfs

+0

Да, я пришел к этой реализации, мои данные сортируются с регулярными интервалами (обычно 15 или 30 минут) – user2981639

Смежные вопросы