Как найти рабочие дни между датами с помощью 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