2013-08-14 2 views
4

Я пытаюсь написать сценарий Python, который рассчитает количество рабочих дней в текущем месяце. Например, если month = August, то businessDays = 22.Использование Python для подсчета количества рабочих дней в месяц?

Вот мой код для обнаружения месяц:

def numToMonth(num): 
    months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] 
    return str(months[ num - 1 ]) 

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

Любая помощь? Я привык к C, C++, поэтому, пожалуйста, не набрасывайте мои «навыки» на Python.

Редактировать: я не могу установить какие-либо дополнительные библиотеки или модули на свою машину, поэтому, пожалуйста, отправьте ответы, используя модули Python по умолчанию. (Python 2.7, datetime и т. Д.) Кроме того, на моем ПК установлена ​​ОС Windows 7.

+1

Это похоже на актуальность: http://stackoverflow.com/questions/2224742/business-days-in-python – alecxe

+0

Спасибо за ссылку! Я рассмотрел этот вопрос, но мне не разрешено устанавливать дополнительные библиотеки на моем компьютере. Я отредактирую свой вопрос, чтобы отразить это. –

+0

Должен ли ваш процесс обработки праздников правильно? – dbf

ответ

9

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

import datetime 

now = datetime.datetime.now() 
holidays = {datetime.date(now.year, 8, 14)} # you can add more here 
businessdays = 0 
for i in range(1, 32): 
    try: 
     thisdate = datetime.date(now.year, now.month, i) 
    except(ValueError): 
     break 
    if thisdate.weekday() < 5 and thisdate not in holidays: # Monday == 0, Sunday == 6 
     businessdays += 1 

print businessdays 
+0

Спасибо за помощь! Мне пришлось немного модифицировать код. (Ваш отпечаток был странным) Но это работает. Еще раз спасибо. –

+0

Нет проблем. Каким образом мой отпечаток был странным? Приведенный выше код только улавливает ошибки PEP8 для длинной строки и стиля комментариев. – chthonicdaemon

+0

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

0

UPDATE: OP не может использовать внешние библиотеки. Затем вам нужно будет построить несколько таблиц на основе determining the day of the week from the calendar.

Формула д + т + у + у/4 + (с модами 7), где: d является днем ​​месяца, м номер месяца в таблице месяцев, у является последними две цифры года, и c - номер столетия.

Это утомительно, но не невозможно!

ORIG Ответ: Это очень утомительно, чтобы закодировать себя, потому что 01 августа 2013 года и 01 августа 2012 года не обязательно в тот же день недели. Я бы начать с классом «дата» в питона (подробнее here

from datetime import date 
datetime.date(2002, 3, 11) 
t = d.timetuple() 
for i in t:  
    print i 

В частности, проверить «datetime.weekday) (» функция.

0

Это относительно просто, просто разбить его на этапы:

  1. Вы должны быть в состоянии перебрать дни в месяце
  2. Вы должны быть в состоянии определить день недели, что любая данная дата приходится на Wikipedia перечислены некоторые методы...
  3. Тогда вам нужны только дни флага недели как рабочие дни или нет.

Объедините эти шаги, и у вас будет рабочий метод.

+0

Спасибо, что побудили меня сделать больше исследований, но я искал метод, уже встроенный в Python. Если он не существует, я отправлю любой алгоритм, который я создаю в качестве ответа. –

0

Вы могли бы взглянуть на datetime.datetime.dayofweek(), но если вы не можете использовать внешнюю библиотеку, то вам необходимо:

  1. выбрать дату, что вы знаете, день недели - лучше всего, если это Понедельник
  2. Придумайте формулы для количества дней с тех пор, что первый из данного месяца.
  3. за каждый день месяца (количество дней с момента вашего дня)% 7 в [5, 6] - выходные.
6

Я бы просто использовать встроенный модуль calendar:

import calendar 

weekday_count = 0 
cal = calendar.Calendar() 

for week in cal.monthdayscalendar(2013, 8): 
    for i, day in enumerate(week): 
     # not this month's day or a weekend 
     if day == 0 or i >= 5: 
      continue 
     # or some other control if desired... 
     weekday_count += 1 

print weekday_count 

это все.

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