В Python, как найти дату первого понедельника данной недели? - PullRequest
28 голосов
/ 29 декабря 2008

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

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

Ответы [ 6 ]

34 голосов
/ 29 декабря 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.

32 голосов
/ 17 августа 2009

Решения PEZ и Джеральда Кашубы работают при условии, что 1 января всегда будет в первую неделю данного года. Это предположение неверно для календаря ISO, см. Документы Python для справки. Например, в календаре ИСО 1-я неделя 2010 года фактически начинается 4 января, а 1 января 2010 года - на 53-й неделе 2009 года. Совместимое с календарем ИСО решение:

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
15 голосов
/ 23 июля 2010
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())
8 голосов
/ 29 декабря 2008

Это похоже на работу, если предположить, что на первой неделе может быть понедельник, приходящийся на день прошлого года.

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
4 голосов
/ 31 декабря 2009

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

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")
0 голосов
/ 29 декабря 2008

Используйте форматирование строки, найденное в модуле времени. Подробное описание используемых форматов

>>> import time
>>> time.strptime("51 08 1","%U %y %w")
(2008, 12, 22, 0, 0, 0, 0, 357, -1)

Возвращаемая дата отключена на одну неделю согласно календарю на моем компьютере, может быть, это потому, что недели индексируются с 0?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...