2014-12-28 3 views
6

Я хочу знать, как вы получаете месяцы по дате, номеру недели и году.Получайте месяц за неделей, днем ​​и годом

Например, если у вас есть что-то вроде этого

def getmonth(day, week, year): 
    # by day, week and year calculate the month 
    print (month) 

getmonth(28, 52, 2014) 
# print 12 

getmonth(13, 42, 2014) 
# print 10 

getmonth(6, 2, 2015) 
# print 1 
+0

Проверить [Календарь] (http://docs.python.org/library/calendar.html#module-calendar) модуль один раз :) –

+0

Почему работать с день/неделю/год? Просто заработайте дату, а затем используйте strftime() с% U или% W. См. Https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior – rtome

+1

Пробуйте день за 12 месяцев и посмотрите, какой из них соответствует правильному номеру недели. – interjay

ответ

2

Per interjay's suggestion:

import datetime as DT 

def getmonth(day, week, year): 
    for month in range(1, 13): 
     try: 
      date = DT.datetime(year, month, day) 
     except ValueError: 
      continue 
     iso_year, iso_weeknum, iso_weekday = date.isocalendar() 
     if iso_weeknum == week: 
      return date.month 

print(getmonth(28, 52, 2014)) 
# 12 

print(getmonth(13, 42, 2014)) 
# 10 

print(getmonth(6, 2, 2015)) 
# 1 
+0

примечание: ["iso week" имеет особое значение] (https://docs.python.org/3/library/datetime.html#datetime.date.isocalendar). 'datetime (2015, 1,1) .isocalendar()' возвращает ожидаемое '(2015, 1, 4)' но 'datetime (2016, 1,1) .isocalendar()' возвращает '(2015, 53, 5) 'т.е. 1 января 2016 года считается * 53-й * iso неделей * предыдущего * 2015 года. – jfs

2
from datetime import datetime, timedelta  
def getmonth(day, week, year): 
    d = datetime.strptime('%s %s 1' % (week-1, year), '%W %Y %w') 

    for i in range(0, 7): 
     d2 = d + timedelta(days=i) 
     if d2.day == day: 
      return d2.month 
+1

Из документов: «При использовании с методом strptime()% U и% W используются только в вычислениях, когда указаны день недели и год». Похоже, что OP использует номер дня в месяце, а не в неделю. – interjay

+0

Да, у вас есть право. – torm

+0

Число дней в примерах OP имеет такие значения, как 28 и 13, поэтому это не может быть днем ​​в неделю. – interjay

2

Вы можете сделать это с isoweek модулем, что-то вроде этого для первого примера:

from isoweek import Week 
w = Week(2014, 52) 
candidates = [date for date in w.days() if date.day == 28] 
assert len(candidates) == 1 
date = candidates[0] # your answer 
+0

большое спасибо за ответ! Короткие и совершенные! :) – Sigils

2

Я использую python-dateutil, когда мне нужно выполнить некоторые сложные операции с датой.

from datetime import date 
from dateutil.rrule import YEARLY, rrule 

def get_month(day, week, year): 
    rule = rrule(YEARLY, byweekno=week, bymonthday=day, dtstart=date(year, 1, 1)) 
    return rule[0].month 
+0

благодарит за ответ! Мне нравится, что вы все даете мне тот же ответ, но по-другому! – Sigils