我定义了一个存储假期的 Pandas CDay()
对象。我如何使用它来计算两个日期之间的工作日数?
我知道 np.busday_count
,但我的日历恰好是 Pandas CDay
。
最佳答案
您可以简单地将周掩码和假期从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: <b>17.2 us per loop</b>
% timeit pd.date_range(datetime(2017, 3, 5), datetime(2017, 3, 12), freq=bday_cust).size
1000 loops, best of 3: <b>573 us per loop</b>
关于python - 如何使用 Pandas CDay 查找日期之间的工作日?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42789645/