strptime другой вывод в python 2.7 по сравнению с python 2.3 и Excel - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть несколько сценариев Python 2.3.4 для перехода на Python 2.7.5, и я обнаружил странную проблему в поведении strptime.

Образец сценария преобразует строку в (номер недели, день, год) формат даты и времени:

dw='51 0 18' # 51 week number , 0 for Sunday and 18 for year 2018 date=time.strptime(dw,"%U %w %y") print(date) Вывод в python 2.3.4:

(2018, 12, 16, 0, 0, 0, 6, 350, -1) # 2018 12 16

Вывод в python 2.7.5:

time.struct_time(tm_year=2018, tm_mon=12, tm_mday=23, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=357, tm_isdst=-1) # 2018 12 23

поведение отличается от номера второй недели года (dw = '2 0 18').

Это известная проблема strptime или я что-то пропустил?

1 Ответ

0 голосов
/ 18 декабря 2018

Существует две распространенные системы нумерации по неделям, и strptime() имеет две директивы для обработки номеров недель ISO (%W: недели начинаются в понедельник) и системы нумерации недель, используемой в Северной Америке (%U: неделиначало в воскресенье).

Я не очень знаком с последней системой, но я рассчитывал, что Excel 2016 есть, и когда я проверял, я обнаружил, что согласен, что в этой системе воскресенье на неделе 51 201816 декабря

=WEEKNUM(DATE(2018,12,16))     --> 51

Википедия дает метод определения недели 1 в североамериканской системе следующим образом: Неделя 1 начинается в воскресенье и содержит 1 января и первую субботу.Или, другими словами, неделя 1 заканчивается в первую субботу января.

Таким образом, до 6 дней недели 1 могут фактически приходиться на предыдущий год, и эти дни также считаются находящимися на неделе 53предыдущий год.

В этой таблице за 7 лет указана дата первого воскресенья года, а слева - дата предыдущего воскресенья.Таким образом, столбец 2 - это 7 дней после столбца 1. Функция Excel 2016 WEEKNUM() сообщает все даты в столбце 2 как неделю 2:

Sunday falls on  Week 2 begins
---------------  -------------
26-Dec-2021      02-Jan-2022
27-Dec-2015      03-Jan-2016
28-Dec-2025      04-Jan-2026
29-Dec-2019      05-Jan-2020
30-Dec-2018      06-Jan-2019
31-Dec-2017      07-Jan-2018
01-Jan-2017      08-Jan-2017

Если я спрашиваю Python 2.7 или 3.7 о воскресенье на неделе 1эти годы, например:

for year in (2022,2016,2026,2020,2019,2018,2017):
    print(time.strftime("%d-%b-%Y",time.strptime("{year} 1 0".format(year=year), "%Y %U %w")))

Я получаю

02-Jan-2022
03-Jan-2016
04-Jan-2026
05-Jan-2020
06-Jan-2019
07-Jan-2018
01-Jan-2017

Итак, для директивы %U стандартной библиотеки Python первая неделя начинается в первое воскресенье января, а незаканчивается в первую субботу.Это разумный подход, просто другой.Разница означает, что %U номера недель совпадают с номерами недель Excel только в те годы, когда 1 января - воскресенье.Во все остальные годы, включая 2018 год, как вы сообщаете, %U даст номер недели, который на единицу меньше.

Я сообщил об этом как об ошибке на bugs.python.org, выпуск 35535 .Похоже, что все согласны с тем, что текущее поведение соответствует документации.То, что Python 2.3 согласен с Excel и Википедией, а Python 2.7 - нет, кажется, считается неубедительным.

Так что, если раньше этого не было, то это известная проблема сейчас.

...