Python - получение номера недели с даты и наоборот не соответствует

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

day1= datetime.datetime(2015,9,28)
day2= datetime.datetime(2017,12,18)

поиск недели работает нормально:

day1.isocalendar()
day2.isocalendar()

возвращается

(2015, 40, 1)
(2017, 51, 1)

Что также соответствует некоторым стандартным календарям: http://whatweekisit.org/calendar-2015.html

Затем я определил следующую функцию:

def week_start_end(year,week):
    '''Given year and week, returns the start and end day of the week
as datetime object'''
    w = "%s-W%s"%(year,week)
    s = datetime.datetime.strptime(w + '-1', "%Y-W%W-%w")#monday
    e= datetime.datetime.strptime(w + '-0', "%Y-W%W-%w")#sunday
    return (s,e)

когда я называю это с годом и неделей в качестве аргументов:

week_start_end(2015,40)
week_start_end(2017,51)

возвращает следующее:

(datetime.datetime(2015, 10, 5, 0, 0), datetime.datetime(2015, 10, 11, 0, 0))
(datetime.datetime(2017, 12, 18, 0, 0), datetime.datetime(2017, 12, 24, 0, 0))

Как видите, на второе свидание это работает хорошо, но не на первое. Попробовав несколько экземпляров, я понял, что эта функция всегда возвращает на неделю позже, чем следовало бы в 2015 году, но делает это правильно для 2016 и 2017 годов.

Я не мог пройти через это. Не могли бы вы мне помочь?

Добро пожаловать на ТАК!

keepAlive 09.10.2018 11:13

Спасибо, мне это уже очень помогло, но на этот раз мне действительно пришлось спросить.

Ferran F 09.10.2018 12:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Различные правила нумерации недель. Номер недели, который вы получаете с% W, не совпадает с номером недели ISO. Я считаю, что вы можете получить номера недель ISO с помощью% V, но я не пробовал, и, похоже, это зависит от платформы.

Ответ принят как подходящий

Почему бы не использовать библиотеку Isoweek

from isoweek import Week

def week_start_end(year, week):
    '''Given year and week, returns the start and end day of the week
as datetime object'''
    w = Week(year, week)
    s = w.monday()
    e = w.sunday()
    return (s,e)

И наконец

>>> week_start_end(2015, 40)
(datetime.date(2015, 9, 28), datetime.date(2015, 10, 4))
>>> week_start_end(2017, 51)
(datetime.date(2017, 12, 18), datetime.date(2017, 12, 24))

Большое спасибо! Моя программа теперь работает нормально. Думаю, есть кое-что, чего я еще не знаю :)

Ferran F 09.10.2018 12:07

Другие вопросы по теме