Как найти рабочие дни между датами с помощью Pandas CDay?

Я определил панд CDay() объект, который хранит праздники. Как я могу использовать это, чтобы найти количество рабочих дней между двумя датами?

Я в курсе np.busday_count, но мой календарь случается, что панды CDay,

1 ответ

Решение

Вы можете просто передать свою недельную маску и праздничные дни от CDay календарь прямо на np.busday_count,

np.busday_count(start_date, end_date,
                weekmask=bday_custom.weekmask, holidays=bday_custom.holidays)

В качестве альтернативы (но, конечно, медленнее), вы можете использовать pd.date_range и передать свой обычай CDay календарь как freq,

pd.date_range(datetime(2017, 3, 5), datetime(2017, 3, 12), freq=bday_cust).size

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


пример

Давайте настроим бессмысленный пользовательский календарь рабочего дня.

from pandas.tseries.offsets import CustomBusinessDay
weekmask = 'Mon Wed Fri Sat'
holidays = [datetime(2017, 3, 6), datetime(2017, 3, 11)]

bday_cust = CustomBusinessDay(holidays=holidays, weekmask=weekmask) 

Теперь мы установили понедельник и субботу как рабочие дни (и праздничные дни) для недели с 5 по 11 марта. Теперь, глядя на этот конкретный диапазон дат, мы можем посчитать оставшиеся рабочие дни (2)

>>> np.busday_count(datetime(2017, 3, 5), datetime(2017, 3, 12),
                    weekmask=bday_custom.weekmask, 
                    holidays=bday_custom.holidays)
2
>>> pd.date_range(datetime(2017, 3, 5), datetime(2017, 3, 12), freq=bday_cust).size
2

Грубый тест на примере

%timeit np.busday_count(datetime(2017, 3, 5), datetime(2017, 3, 12),
                        weekmask=bday_custom.weekmask, 
                        holidays=bday_custom.holidays)
100000 loops, best of 3: 17.2 us per loop

% timeit pd.date_range(datetime(2017, 3, 5), datetime(2017, 3, 12), freq=bday_cust).size
1000 loops, best of 3: 573 us per loop
Другие вопросы по тегам