В Python, как мне найти дату первого понедельника данной недели?

Если у меня есть определенный номер недели (например, 51) и данный год (например, 2008), как мне найти дату первого понедельника той же недели?

Большое спасибо

«Первый понедельник недели»? Сколько понедельников в неделе?

Federico A. Ramponi 29.12.2008 03:47

В некоторых неделях два понедельника сменяют друг друга, по крайней мере, так кажется.

Lasse V. Karlsen 29.12.2008 03:48
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
28
2
22 384
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий
>>> 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. Используйте метод Вайдаса, приведенный ниже, для более точного метода.

ralphje 02.01.2013 18:22

Кажется, это работает, если предположить, что на первой неделе понедельник выпадет на день прошлого года.

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.

Vaidas K. 13.09.2013 14:44
time.strftime('%W') в тот день дал мне 35. Сегодня дает мне 36. Это не так?
2rs2ts 13.09.2013 18:35

Как отмечено в комментарии Ральфье к принятому ответу,% W использует собственную реализацию номеров недель, а не стандарт ISO. Также обратите внимание, что% W начинается с 0.

Vaidas K. 21.10.2013 18:40

Я немного изменил сценарий Вайдаса К. таким образом, чтобы он возвращал начало недели и конец дня недели.

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], чтобы определить текущую неделю года

robertzp 19.05.2014 08:26

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