





>>> 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.
Обратите внимание, что эта функция некорректно работает с isocalendar (). Например, первая неделя 2013 года начинается 31 декабря (что правильно), но 2012-1 начинается с 26 декабря (что должно быть 2 января). Это вызвано тем, что% W использует собственную реализацию номеров недель, а isocalendar () использует стандарт ISO. Используйте метод Вайдаса, приведенный ниже, для более точного метода.
Кажется, это работает, если предположить, что на первой неделе понедельник выпадет на день прошлого года.
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
Используйте форматирование строки, найденное в модуле времени. Подробное объяснение используемых форматов
>>> import time
>>> time.strptime("51 08 1","%U %y %w")
(2008, 12, 22, 0, 0, 0, 0, 357, -1)
Возвращенная дата отличается на одну неделю в соответствии с календарем на моем компьютере, может быть, это потому, что недели индексируются с 0?
Решения PEZ и Джеральда Касзубы работают в предположении, что 1 января всегда будет первой неделей данного года. Это предположение неверно для календаря ISO, см. Документы Python для справки. Например, в календаре ISO первая неделя 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
Согласно этот список, 3 сентября (день публикации вашего комментария) было 36-й неделей 2013 года по календарю ISO. week_start_date(2013,36) возвращается 02.09.2013.
time.strftime('%W') в тот день дал мне 35. Сегодня дает мне 36. Это не так?
Как отмечено в комментарии Ральфье к принятому ответу,% W использует собственную реализацию номеров недель, а не стандарт ISO. Также обратите внимание, что% W начинается с 0.
Я немного изменил сценарий Вайдаса К. таким образом, чтобы он возвращал начало недели и конец дня недели.
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
Так что вы можете использовать это таким образом.
weekbeg, weekend = weekbegend(2009, 1)
begweek = weekbeg.strftime("%A %d %B %Y")
endweek = weekend.strftime("%A %d %B %Y")
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())
работает хорошо, если вам нужно определить начало текущей недели - используйте datetime.datetime.now (). isocalendar () [1], чтобы определить текущую неделю года
«Первый понедельник недели»? Сколько понедельников в неделе?