2016-07-29 1 views
1

Я использую Python 2.7, и я пытаюсь преобразовать числа недель в фактические даты.Является ошибкой Python `datetime.strptime` для недельных номеров в течение лет с 53 неделями?

Я использовал this решение, которое отлично работало для тестов основы, но я нашел случай, когда есть разрыв: в годах с 53 неделями.

На приведенном ниже рисунке вопрос:

datetime.datetime.strptime("2015-W53-0", "%Y-W%W-%w").strftime("%Y-W%W-%w") 

Это возвращает '2016-W01-0', который я думаю, не имеет смысла.

Это известная проблема, существует ли известное обходное решение?

Обратите внимание, что:

datetime.datetime.strptime("2015-W53-0", "%Y-W%W-%w").isocalendar() 

дает (2016, 1, 7), так что, вероятно strptime, который угадал неправильно здесь.

ответ

1

% W это неделя года, начиная с первой недели содержащей понедельник считается неделя 1.

В первый день недели является понедельник, что имеет% вес день числа 1. Последнее день недели - воскресенье, число которого равно 0. Таким образом, в этом расчете% Y-% W-0 всегда приходит на шесть дней позже, чем% Y-% W-1.

Считается, что 52-я неделя начинается 28 декабря и не содержит воскресенья. Таким образом, 2015-W52-0 интерпретируется как первое воскресенье в 2016 году (3 января). Поскольку это до первого понедельника, 2015-W52-0 - канонически 2016-W00-0, а 2015-W53-0 - второе воскресенье в 2016 году, которое находится в конце недели 1, то есть 10 января или 2016-W01 -0.

Таким образом, методы работают как documented.

% W и% w не применяют алгоритм даты недели ISO, который устанавливает первую неделю как то, что содержит четверг. 2015 год содержит 53-я неделя по методу ISO, но не по методу% W. Если вы хотите использовать выходные дни ISO, вы должны использовать isocalendar.

Поскольку стандартная реализация python просто вызывает функции библиотеки C, вы можете использовать% G (год) и% V (номер недели) в соответствии с алгоритмом ISO. Но они не могут быть переносимыми.

1

Я действительно нашел хорошую библиотеку под названием isoweek, которая работает так, как я ожидаю.

#This is Week 53 of 2015 according to ISO 
week = isoweek.Week.withdate(datetime.date(2016,1,1)) 
monday = week.monday() 
print monday.isocalendar() 
#Prints (2015, 53, 1), which is correct. 

Я думаю, что это самый простой способ справиться с этими проблемами.

+0

Это работает, спасибо за публикацию решения. Вы можете принять свой собственный ответ на этот вопрос. Жаль, что 'strptime' не поддерживает'% G' и '% V' для дат ISO *. Джеймс К * упоминает (по крайней мере, не в Python 3.5.2). – JeroenHoek

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