熊猫 - 使用自定义日历获取日期之间的营业日?

时间:2017-09-07 13:55:05

标签: python-2.7 pandas

我想用熊猫计算两天之间的工作日。但是,必须考虑到Brazilian holidays

有没有有效的方法可以做到这一点?

1 个答案:

答案 0 :(得分:5)

您可以使用custom-business-days。点击链接查找更多详细信息。

  

CDay或CustomBusinessDay类提供参数化的BusinessDay类,可用于创建自定义的工作日日历,以考虑本地假日和本地周末会议。

import pandas as pd
import datetime
from pandas.tseries.offsets import CustomBusinessDay

 # Read holidays from excel, format them to dates, remove unwanted rows. 
holidayfile ='feriados_nacionais.xls'   
df_holiday = pd.read_excel(holidayfile)
df_holiday = df_holiday.convert_objects(convert_dates='coerce')
df_holiday = df_holiday.dropna(subset=['Data'])

holidays=df_holiday['Data'].tolist()

bday_Brazil = CustomBusinessDay(holidays=holidays)

dt = datetime.datetime(2017,10,10)
print (dt + bday_Brazil)
dt = datetime.datetime(2017,10,11)
print (dt + bday_Brazil)
dt = datetime.datetime(2017,10,12)
print (dt + bday_Brazil)
dt = datetime.datetime(2017,10,13)
print (dt + bday_Brazil)

输出

2017-10-11 00:00:00
2017-10-13 00:00:00
2017-10-13 00:00:00
2017-10-16 00:00:00

现在使用np.busday_count()并传递自定义假期

  

holidays:date_64的array_like [D],可选   要考虑作为无效日期的日期数组。它们可以按任何顺序指定,并且忽略NaT(非一次)日期。此列表以标准化形式保存,适合快速计算有效天数。

df = pd.read_fwf(StringIO(u"""
    order_from  date_to
    2017-10-10  2017-10-16
    2017-04-09  2017-04-18
    2017-04-10  2017-04-20"""), header=1)
df.order_from = pd.to_datetime(df.order_from, infer_datetime_format=True)
df.date_to = pd.to_datetime(df.date_to, infer_datetime_format=True)

df['date_diff'] = np.busday_count(
    df.order_from.values.astype('datetime64[D]'),
    df.date_to.values.astype('datetime64[D]'),holidays=holidays)
print (df)

输出

  order_from    date_to  date_diff
0 2017-10-10 2017-10-16          3
1 2017-04-09 2017-04-18          5
2 2017-04-10 2017-04-20          7