获取 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
效果图:
上传我的工程 demo 包:workdate_demo.zip
👏
上传 demo 工程是个好习惯,大家学习一下,测试一下
双休可以用 weekday 计算,但是如果这样计算,调休需要额外考虑