获取 T-n 工作日 日期解决方案

在金融行业中,经常会有关于工作日的需求,前一工作日啊,前两工作日啊,当月的第几个工作日啊之类的 ,这些日期怎么获取呢,下面我分享一个解决方案
本地配置一张节假日的表格, 类似这种,把所有的双休日和节日配置进去。通过读取表格将节假日的日期全部读进缓存,方便我们实现需求。
获取 T-n 工作日 日期解决方案
我们把 excel 存放在工程 code 目录下(也可以自定义存放路径)

# coding=utf-8
import pandas as pd , sys
import ubpa.iexcel as iexcel
import ubpa.itools.rpa_time as rpa_time
#读取整列   若excel不是存放在工程code目录下  此处路径自定义
holiday_list = iexcel.read_col(path=sys.path[0] + '\\' + 'holiday.xlsx',cell='B2')

#传入日期是否为工作日       入参日期样式  2018-11-23
def is_innerdate_workdate(inner_date):
    flag = False
    tmp_date=inner_date.replace('-','.')
    if tmp_date not in holiday_list:
        flag = True
    print(flag)
    return flag
#获取传入日期的前一工作日   入参日期样式  2018-11-23
def previous_one_workdate(inner_date):
    tmp_date=inner_date.replace('-','.')
    while True:
        tmp_date = rpa_time.dete_dalta(days=-1,date=tmp_date,format='%Y.%m.%d',return_format='%Y.%m.%d')
        if tmp_date in holiday_list:
            pass
        else:
            break
    previous_one=tmp_date.replace('.','-')
    print('%s  前一工作日:  %s'%(inner_date,previous_one))
    return previous_one
#获取传入日期的前两工作日   入参日期样式  2018-11-23
def previous_two_workdate(inner_date):
    previous_one = previous_one_workdate(inner_date)
    previous_two = previous_one_workdate(previous_one)
    print('%s  前两工作日:  %s'%(inner_date,previous_two))
    return previous_two
    
#获取当月的第n个工作日      入参规则  n>0
def get_currentmonth_Nworkdate(n):
    tmp_month = rpa_time.get_current_datetime_str(format='%Y.%m')
    #读取整列   若excel不是存放在工程code目录下  此处路径自定义
    df = pd.read_excel(sys.path[0] + '\\' + 'holiday.xlsx',header=None)
    df = df[df[1].str.startswith(tmp_month)]
    tmp_list = df[1].tolist()
    tmp_date = tmp_month+ '.01'
    i = 0
    if tmp_date not in tmp_list:
        i += 1
    if i != n:
        while True:
            tmp_date = rpa_time.dete_dalta(days=1,date=tmp_date,format='%Y.%m.%d',return_format='%Y.%m.%d')
            if tmp_date not in tmp_list:
                i += 1
                if i == n:
                    break
        
    result_date = tmp_date.replace('.','-')
    print('%s的  第%d个工作日:  %s'%(tmp_month,n,result_date))
    return result_date

效果图:
获取 T-n 工作日 日期解决方案

上传我的工程 demo 包:workdate_demo.zip