У меня следующая проблема: с заданной даты мне нужно найти номер недели в этом году, а затем найти день начала и день окончания этой недели.
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 годов.
Я не мог пройти через это. Не могли бы вы мне помочь?
Спасибо, мне это уже очень помогло, но на этот раз мне действительно пришлось спросить.






Различные правила нумерации недель. Номер недели, который вы получаете с% 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))
Большое спасибо! Моя программа теперь работает нормально. Думаю, есть кое-что, чего я еще не знаю :)
Добро пожаловать на ТАК!