Python datetime isocalendar дает неверный кортеж - PullRequest
0 голосов
/ 02 апреля 2019

Вот мой код Python

import datetime
a = datetime.datetime(2012, 1, 1)
print(a.isocalendar())

и вывод

(2011, 52, 7)

Форматом вывода является кортеж, содержащий год, номер недели и день недели в соответствующем порядке для данного экземпляра даты.

Почему это так? Разве это не должно быть (2012, 1, 1), если нет, как я могу преобразовать его в абсолютный номер недели?

Ответы [ 2 ]

3 голосов
/ 02 апреля 2019

В соответствии с документацией isocalendar:

Возвращает 3-х кортеж (год ISO, номер недели ISO, день недели ISO).

Календарь ИСО является широко используемым вариантом григорианского календаря.См. https://www.staff.science.uu.nl/~gent0113/calendar/isocalendar.htm для хорошего объяснения.

Год ISO состоит из 52 или 53 полных недель, и где неделя начинается в понедельник и заканчивается в воскресенье. Первая неделя года ISO - это первая (григорианская) календарная неделя года, содержащая четверг. Это называется неделей номер 1, и год ISO этого четверга совпадает с его григорианским годом.

Например, 2004 год начинается в четверг, поэтому первая неделя 2004 года ИСО начинается в понедельник, 29 декабря 2003 года, и заканчивается в воскресенье, 4 января 2004 года, то есть в эту дату (2003, 12, 29).isocalendar () == (2004, 1, 1) и дата (2004, 1, 4) .isocalendar () == (2004, 1, 7).

В вашем случае 1 января2012 год - воскресенье, поэтому согласно правилам календаря ISO первая неделя 2012 года - 2 января - 8 января (поскольку первый четверг - 5 января), а 1 января - последняя неделя 2011 года.

1 голос
/ 02 апреля 2019

Похоже, вы хотите номер недели в Северной Америке, а не номер недели ISO.

>>> a = datetime.datetime(2012, 1, 1)
>>> a.strftime("%Y %U")
'2012 01'
...