2015-09-21 2 views
0

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

Например:

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

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

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

here Как показано

Примечание

Я нашел лот q ОПРОСЫ просят:

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

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

ответ

1

Трудность с 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). Тогда для понимания добавляет все большую разницу во время, как мы перебираем неделю:

>>> 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] 
+0

Он возвращается 6 дней. Я знаю, что isocalendar рассматривает понедельник как 1, но я работаю с будним днем ​​с даты и времени, которые рассматривают понедельник как 0. Как это подходит для работы с понедельника 0 и в воскресенье 6? – Gocht

+0

Проверьте обновление! Посмотрите, относится ли это к вашей проблеме. –

+0

Это довольно близкий чувак, я работаю с понедельником как 0 Я постараюсь получить список wirh с понедельника по воскресенье. Я вижу, что вы возвращаетесь с воскресенья по субботу. В ссылке, которую я предоставил [это] (http://www.timeanddate.com/calendar/index.html?country=18&year=), неделя подсчитывается от пн до солнца, в настоящее время на неделе 39, как и в моем ответе, является то, что возможно ? – Gocht

0

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

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

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

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

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

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

+0

Иногда 1-й янв не в первую неделю, как вы можете видеть [здесь] (http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php?year=2010) – Gocht

+0

Право - следовательно, вычисление смещение. – Prune

1

, конечно, может быть улучшен, но работает, кажется ....

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 Среда

+0

Бицепс, я попробую. Спасибо за вашу помощь. – Gocht

Смежные вопросы