如何在Pandas CDay的日期之间找到工作日?

时间:2017-03-14 15:08:55

标签: python pandas datetime numpy

我已经定义了一个存储假期的Pandas CDay()对象。如何使用它来查找两个日期之间的工作日数?

我知道np.busday_count,但我的日历恰好是Pandas CDay

1 个答案:

答案 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