Дни/даты на данной неделе

Я пытаюсь получить список с днями на данной неделе. Я могу получить год и неделю.

E.g.:

>>> year, week, dow = datetime.today().isocalendar()
>>> week
>>> 39

Я хотел бы получить 7 дней в неделе 39. В этом году, 2015, я бы получил

[21, 22, 23, 24, 25, 26, 27]

Как показано здесь

Примечание

Я нашел много вопросов, которые задают:

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

Мне нужно получить 7 дней данной недели, в данном случае 39-й недели. Спасибо за ваше время.


person Gocht    schedule 21.09.2015    source источник


Ответы (3)


Сложность с isocalendar заключается в том, что на самом деле он не считает день месяца. Поэтому вам нужно перевести обратно, чтобы получить это. strptime может помочь:

year, week, dow = datetime.today().isocalendar()
result = [datetime.strptime(str(year) + "-" + str(week-1) + "-" + str(x), "%Y-%W-%w").day for x in range(1,7)]

Здесь мы создаем строку, которую striptime может понять, начиная с недели назад (для учета отсчета от 0 до 1) и начиная с начала недели (понедельник, который равен 1), и конструируя дату и время для каждого день вперед 7 дней.

Играя с week между этими двумя утверждениями (добавляя или удаляя недели, чтобы получить месячные перерывы), мы видим, что это работает:

>>> year, week, dow = datetime.today().isocalendar()
>>> result = [datetime.strptime(str(year) + "-" + str(week-1) + "-" + str(x), "%Y-%W-%w").day for x in range(1,7)]
>>> result
[21, 22, 23, 24, 25, 26]
>>> year, week, dow = datetime.today().isocalendar()
>>> week = week + 1
>>> result = [datetime.strptime(str(year) + "-" + str(week-1) + "-" + str(x), "%Y-%W-%w").day for x in range(1,7)]
>>> result
[28, 29, 30, 1, 2, 3]

Теперь, чтобы решить две очень серьезные проблемы, поднятые в комментариях, мы должны немного изменить ситуацию:

year, week, dow = datetime.today().isocalendar()
week_start = datetime.strptime(str(year) + "-" + str(week-2) + "-0", "%Y-%W-%w")
result = [(week_start + timedelta(days=x)).day for x in range(0,7)]

Это использует timedelta для увеличения. Чтобы это работало, мы должны выполнить резервное копирование через неделю (отсюда -2 вместо -1). Затем for comprehension добавляет все большую временную дельту по мере того, как мы повторяем неделю:

>>> year, week, dow = datetime.today().isocalendar()
>>> week_start = datetime.strptime(str(year) + "-" + str(week-2) + "-0", "%Y-%W-%w")
>>> result = [(week_start + timedelta(days=x)).day for x in range(0,7)]
>>> result
[20, 21, 22, 23, 24, 25, 26]
>>> year, week, dow = datetime.today().isocalendar()
>>> week = week + 1
>>> week_start = datetime.strptime(str(year) + "-" + str(week-2) + "-0", "%Y-%W-%w")
>>> result = [(week_start + timedelta(days=x)).day for x in range(0,7)]
>>> result
[27, 28, 29, 30, 1, 2, 3]
person Nathaniel Ford    schedule 21.09.2015
comment
Возвращается 6 дней. Я знаю, что изокалендарь считает понедельник равным 1, но я работаю с днем ​​недели с даты и времени, которые считают понедельник равным 0. Как это может работать с понедельником 0 и воскресеньем 6? - person Gocht; 22.09.2015
comment
Проверьте обновление! Посмотрите, относится ли это к вашей проблеме. - person Nathaniel Ford; 22.09.2015
comment
Это довольно близко, чувак, я работаю с понедельника как 0, я постараюсь получить список с датами с понедельника по воскресенье. Я вижу, ты возвращаешься с воскресенья на субботу. В приведенной мной ссылке эта неделя считается с понедельника по воскресенье. , в настоящее время на 39 неделе, как в моем ответе, это возможно? - person Gocht; 22.09.2015
comment
Я уверен, что это просто вопрос корректировки смещения индекса Доу. Чтобы эффективно связать то, где вы его используете, с приведенными выше фрагментами кода, вам нужно предоставить пример того, каковы ваши ожидаемые входные и выходные данные. - person Nathaniel Ford; 22.09.2015
comment
Теперь я попытаюсь настроить его, чтобы получить не только дату даты, но и полную дату. - person Gocht; 22.09.2015

конечно можно улучшить, но вроде работает....

def days_of_the_current_numbered_week():

    import datetime
    import  calendar

     # dictionary of days of the week
    days = {   0 :  "Sunday",
            1 : "Monday",
            2 : "Tuesday",
            3 : "Wednesday",
            4 : "Thursday",
            5 : "Friday",
            6 : "Saturday",
            7 : "Sunday" }


    allYearDates = []
    w_days_numbers = []

    # today
    now = datetime.datetime.now()

    # get current values for year, mon, day
    year = int(now.year)
    mon = int(now.month)
    day = int(now.day)

    # get this week number
    # thisWeekN = datetime.date(year, mon, day).isocalendar()[1]

    thisWeekN = datetime.datetime.utcnow().isocalendar()[1]

    # get Calendar obect
    c = calendar.Calendar()

    # get all the days for this year in a list
    for i in range(1, 13):
        for d in c.itermonthdays2(year, i):
            allYearDates.append(d)
    # in the first seven days could be 0's as days, to continue week #'s
    # these tuples need to be removed to produce accurate mapping between
    # weeks and 7 days chunks
    first_seven = allYearDates[:7]
    no_zeros =  [ d for d in first_seven if  d[0] != 0]

    allYearDates = no_zeros + allYearDates[8:]
    # divid all days of year list into one week chuncks
    lt7 = listChunks(allYearDates,7)

    # get days for this week number
    thisWeekDays = lt7[thisWeekN]

    # remove right part of the days tuple
    sevenDaysL = [x for x,y in  thisWeekDays]

    # get week day numbers  1-7 for this week
    for d in sevenDaysL:
        w_days_numbers.append(datetime.date(year, mon, d).isocalendar()[2])

    # zip week day numbers with the dates
    zl = zip(sevenDaysL, w_days_numbers)

    # month number prefix
    if thisWeekN == 1:
        prefix = 'st'
    elif thisWeekN == 2:
        prefix = 'nd'
    elif thisWeekN == 3:
        prefix = 'rd'
    else:
        prefix= "th"

    # print heading
    print("\n 7 days of this {}{} week: of the year {}"
          .format(thisWeekN,prefix, year))
    print("-------------------------------------------")

    # print results
    for el in  list(zl):
        if el[0] == day:
            print("* {} *  {}".format(el[0],days[el[1]]))
        else:
            print("  {}    {}".format(el[0],days[el[1]]))

    mytime= datetime.datetime.now().strftime("%Y-%m-%d %H-%M")
    print("================")
    print(mytime)

days_of_the_current_numbered_week()

ВЫВОД

7 дней этой 39-й недели: года 2015

17 четверг

18 пятница

19 суббота

20 воскресенье

21 понедельник

22 вторник

23 среда

person LetzerWille    schedule 22.09.2015
comment
Бис подход, я попробую. Спасибо за вашу помощь. - person Gocht; 22.09.2015

Сначала найдите день недели, с которого начинается год. Это легко найти в Интернете. Это дает вам смещение 1 недели в году.

Обратите внимание, что неделя позволит вам вычислить день года в диапазоне от 1 до 365. Неделя 01 начинается в день 1; неделя 02 начинается с 8 дня и т. д.

start_day = 1 + (неделя-1) * 7 - смещение

Сначала найдите день недели, с которого начинается год. Это легко найти в Интернете. Это дает вам смещение 1 недели в году.

теперь, когда у вас есть день начала, вы можете легко найти день месяца. Немного утомительно вычитать дни в каждом месяце, пока вы не попадете в диапазон данного месяца, но это просто.

Это тебя заводит? Я сделал это в описании на английском языке, так как вы не предоставили нам никакого кода для отладки.

person Prune    schedule 21.09.2015
comment
Иногда 1 января приходится не на первую неделю, как вы можете видеть здесь - person Gocht; 22.09.2015
comment
Правильно - следовательно, вычисление смещения. - person Prune; 22.09.2015