2015-08-19 3 views
0
from datetime import datetime 

def calculate_whole_week(year, start_month, end_month, weekday): 
    date_str_start = str(year)+' ' + start_month+' '+ weekday 
    date_str_end = str(year)+' ' + end_month+' '+ weekday 
    start_day = datetime.strptime(date_str_start, '%Y %B %A') 
    end_day = datetime.strptime(date_str_end, '%Y %B %A') 
    no_of_whole_weeks = (end_day - start_day).days//7 -1 
    return no_of_whole_weeks 


calculate_whole_week(2014,'April','May','Wednesday') 

Я попытался следующие, но я не могу скомпилировать егоРассчитайте нет целых недель для данной даты

start_week_day = time.strptime(str(Y)+' '+ A + ' '+ W,"%Y %B %A").tm_wday 
end_week_day = time.strptime(str(Y)+' '+ B + ' '+ W,"%Y %B %A").tm_wday 

start_dt = time.strptime(str(Y)+' '+A+' '+ str(start_week_day),'%Y %B %d') 
end_dt = time.strptime(str(Y)+' '+ B +' '+ str(end_week_day),'%Y %B %d') 
no_of_whole_weeks = (end_dt - start_dt).days//7 -1 
print (end_dt - start_dt).days 
return no_of_whole_weeks 

Челлендж я столкнулся здесь, как рассчитать точную дату будний день я пройти

Если я запускаю приведенный выше код я получаю 3 вместо 7

+0

Что? Что же это такое? Вы знаете, что будние дни появляются несколько раз за определенный месяц, верно? – jonrsharpe

+0

Lol. Я знаю, что это выглядит глупо. У меня кончились идеи. – Newbie

ответ

2

Почему вы не разорвать эту проблему на более мелкие куски, и решать каждый по отдельности? Например:

  1. Учитывая две date или datetime объекты, определяют количество целых недель между ними:

    def whole_weeks(start, end): 
        """Number of whole weeks between start and end dates.""" 
        weeks = 0 
        while start <= end: 
         start += datetime.timedelta(weeks=1) 
         weeks += 1 
        return weeks - 1 
    
  2. Учитывая год, название месяца и дня недели имя, вычислить первую дату, соответствующую его :

    def first_matching_date(year, month_name, weekday_name): 
        """The first date a weekday occurred in a given month and year.""" 
        day = datetime.datetime.strptime(str(year) + month_name, '%Y%B') 
        for _ in range(7): 
         if day.strftime('%A') == weekday_name: 
          return day 
         day += datetime.timedelta(days=1) 
        raise ValueError('no matching date for {!r}'.format(weekday_name)) 
    
  3. Поэтому, учитывая год, два месяца и дня недели, найти количество полных недель между первое появление этого дня недели в каждом месяце:

    def calculate_whole_week(year, start_month, end_month, weekday_name): 
        """Whole weeks between the weekday in specified start and end month.""" 
        return whole_weeks(
         first_matching_date(year, start_month, weekday_name), 
         first_matching_date(year, end_month, weekday_name), 
        ) 
    

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

>>> calculate_whole_week(2014, 'April', 'May', 'Wednesday') 
5 

что на самом деле составляет целые недели между первой средой в апреле 2014 года (2014/4/2) и первой средой в мае 2014 года (2014/5/7); Я не уверен, почему вы ожидали 7. Возможно, я неправильно понял конкретную проблему, но надеюсь, вы можете принять процесс разложения его и применить его к вашей реальной задаче.

+0

Он выглядит хорошо. Я подтвержу, почему это должно быть 7 вместо 5. – Newbie

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