2014-01-16 3 views
3

Я получаю количество дней до следующего «платежного цикла» (к примеру), который начинается на nth день месяца:Как я рассчитывать только в будние дни с timedelta в питоне

from dateutil.relativedelta import relativedelta 

dt = datetime.utcnow() + relativedelta(months=1,day=schedule.cycle_start) 
days_till_next_cycle = dt - datetime.utcnow() 

Где schedule.cycle_start будет что-то вроде 2 во второй день месяца.

Это работает ... Но:

Как найти число рабочих дней в этом timedelta.

Я взглянул на https://pypi.python.org/pypi/BusinessHours/ и не нашел никакой документации.

Я также видел это: Business days in Python, который связал меня со ссылкой выше и катил мой собственный. С тех пор прошло еще 4 года, и я надеялся, что может быть более простой способ?

ответ

5

С rrule я смог получить следующее, используя определение DT сверху:

from dateutil.rrule import * 
    number_weekdays = rrule(WEEKLY, byweekday=(MO,TU,WE,TH,FR), dtstart=datetime.utcnow(),until=dt).count() 
+0

Хороший ответ! Btw, 'rrule's также имеют [метод подсчета] (http://labix.org/python-dateutil#head-cf004ee9a75592797e076752b2a889c10f445418). – unutbu

+0

Очень круто! Если я хочу рассчитать только «Мо», «Ту», «Т», «Фр», я могу просто оставить «мы» из кортежа? И это просто сработает? (Если, например, бизнес не был открыт по средам?) – Johnston

+0

спасибо, что указали способ count() –

1

Здесь простую функцию, которая Подсчитать количество рабочих дней между 2 датами:

def business_days(since, until): 
    since_isoweekday = since.isoweekday() + 1 
    return len([x for x in range(since_isoweekday, 
           since_isoweekday + (until - since).days) 
       if x % 7 not in [0, 6]]) 

not in [0, 6] стенды в субботу и воскресенье.

Некоторые тесты:

>>> since = datetime.datetime(2014, 6, 2) 
>>> until = datetime.datetime(2014, 6, 30) 
>>> business_days(since, until) 
20 
>>> since = datetime.datetime(2014, 6, 25) 
>>> until = datetime.datetime(2014, 7, 4) 
>>> business_days(since, until) 
7 
Смежные вопросы