我想用熊猫计算两天之间的工作日。但是,必须考虑到Brazilian holidays。
有没有有效的方法可以做到这一点?
答案 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