Если у меня есть определенный номер недели (например, 51) и определенный год (например, 2008), как мне найти дату первого понедельника той же недели?
Большое спасибо
Если у меня есть определенный номер недели (например, 51) и определенный год (например, 2008), как мне найти дату первого понедельника той же недели?
Большое спасибо
>>> import time
>>> time.asctime(time.strptime('2008 50 1', '%Y %W %w'))
'Mon Dec 15 00:00:00 2008'
Предполагая, что первый день вашей недели - понедельник, используйте %U
вместо %W
, если первый день вашей недели - воскресенье. Подробнее см. Документацию для strptime.
Обновление: Исправлен номер недели. Директива %W
основана на 0, так что неделя 51 будет введена как 50, а не 51.
Решения PEZ и Gerald Kaszuba работают в предположении, что 1 января всегда будет в первую неделю данного года. Это предположение неверно для ISO-календаря, см. Документы Python для справки. Например, в календаре ISO 1 неделя 2010 года начинается с 4 января, а 1 января 2010 года - на 53 неделе 2009 года. Решение, совместимое с календарем ISO:
from datetime import date, timedelta
def week_start_date(year, week):
d = date(year, 1, 1)
delta_days = d.isoweekday() - 1
delta_weeks = week
if year == d.isocalendar()[0]:
delta_weeks -= 1
delta = timedelta(days=-delta_days, weeks=delta_weeks)
return d + delta
from datetime import date, timedelta
def first_monday(year, week):
d = date(year, 1, 4) # The Jan 4th must be in week 1 according to ISO
return d + timedelta(weeks=(week-1), days=-d.weekday())
Это, похоже, работает, если неделя может быть в понедельник падала на день в прошлом году.
from datetime import date, timedelta
def get_first_dow(year, week):
d = date(year, 1, 1)
d = d - timedelta(d.weekday())
dlt = timedelta(days = (week - 1) * 7)
return d + dlt
Я немного изменил script Vaidas K. таким образом, что он вернет начало недели и конец дня недели.
from datetime import datetime, date, timedelta
def weekbegend(year, week):
"""
Calcul du premier et du dernier jour de la semaine ISO
"""
d = date(year, 1, 1)
delta_days = d.isoweekday() - 1
delta_weeks = week
if year == d.isocalendar()[0]:
delta_weeks -= 1
# delta for the beginning of the week
delta = timedelta(days=-delta_days, weeks=delta_weeks)
weekbeg = d + delta
# delta2 for the end of the week
delta2 = timedelta(days=6-delta_days, weeks=delta_weeks)
weekend = d + delta2
return weekbeg, weekend
Soyou может использовать его таким образом.
weekbeg, weekend = weekbegend(2009, 1)
begweek = weekbeg.strftime("%A %d %B %Y")
endweek = weekend.strftime("%A %d %B %Y")
Используйте форматирование строк, найденное в модуле времени. Подробное объяснение используемых форматов
>>> import time
>>> time.strptime("51 08 1","%U %y %w")
(2008, 12, 22, 0, 0, 0, 0, 357, -1)
Дата возврата отключена на одну неделю в соответствии с календарем на моем компьютере, возможно, это потому, что недели индексируются с 0?