我已经定义了一个存储假期的Pandas CDay()
对象。如何使用它来查找两个日期之间的工作日数?
我知道np.busday_count
,但我的日历恰好是Pandas CDay
。
答案 0 :(得分:2)
您只需将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)
现在我们将星期一和星期六定为3月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