Кажется, что strptime создает неправильную дату с номера недели

Кажется, что strptime создает неправильную дату с номера недели …

Первый случай:

dt1 = dateutil.parser.parse('2016-01-04 00:00:00+01:00') dt1.isocalendar() => (2016, 1, 1) # (year, week number, week day) from datetime import datetime datetime.strptime('2016 1 1', '%Y %W %w') => datetime.datetime(2016, 1, 4, 0, 0) # OK 

Второй случай:

 dt1 = dateutil.parser.parse('2015-12-28 00:00:00+01:00') dt1.isocalendar() => (2015, 53, 1) # (year, week number, week day) datetime.strptime('2015 53 1', '%Y %W %w') => datetime.datetime(2016, 1, 4, 0, 0) # Should return datetime.datetime(2015, 12, 28, 0, 0) 

Что не так ?

strptime %W использует обычные календарные недели. Дата недели ISO отличается от обычного календаря. Годы делятся на 52 или 53 недели ровно (364 или 371 день).

В настоящее время python strptime не поддерживает выходные дни iso, но он запланирован для python 3.6. Затем вы можете использовать %G %V %w (я думаю), чтобы анализировать выходные дни iso. http://bugs.python.org/issue12006

До тех пор вы можете использовать пакет isoweek для синтаксического анализа недельных дат. https://pypi.python.org/pypi/isoweek/

Дело здесь, когда вы даете

 from datetime import datetime print(datetime.strptime('2015 52 1', '%Y %W %w')) o/p : 2015-12-28 00:00:00 

вы получите вышеупомянутый день.

 %W The week number of the year (Monday as the first day of the week) as a decimal number [00,53]; leading zeros are permitted but not required. 

это займет первый день с понедельника.

Когда вы попробуете это

 from datetime import datetime print(datetime.strptime('2015 1 1', '%Y %W %w')) 

Он сказал бы 2015-01-05 00:00:00 . Итак, когда мы придем к 53 неделе 2015 года. Функции strptime берут первый понедельник в 2016 году. Таким образом, вы получаете 4-01-2016.

Обновление :

Когда вы попробуете это

 from datetime import datetime print(datetime.strptime('2015 52 1', '%Y %W %w')) o/p : 2015-12-28 00:00:00 

которая является последней неделей 2015 года.

 from datetime import datetime print(datetime.strptime('2015 53 1', '%Y %W %w')) print(datetime.strptime('2016 1 1', '%Y %W %w')) 

Эти два дадут вам тот же результат.