Python计算两个日期间的工作日(交易日),去除周末节假日

首先区分一下这里的工作日和节假日是不同的。
工作日是指去掉节假日即周末,但是不去掉调休的日期。
交易日主要针对金融行业,是指去掉节假日和周末,因为周末金融市场也是停盘的,所以即使周末因为调休工作,也不算做交易日。
我们这里主要用到Python中datetime模块。还有一个特别好用的模块就是chinesecalendar,它主要能够实时更新中国的节假日有哪些,简直就是一个利器。
首先安装chinesecalendar也非常容易,我是在Anaconda Promot中安装的:

pip install chinesecalendar

安装完成之后,下面看一下两个方法的使用:

  • is_workday:判断是否为工作日,返回布尔值
  • is_holiday:判断是否为节假日,返回布尔值
from chinese_calendar import is_workday, is_holiday
import datetime
day1 = datetime.date(2020,1,18)
day2 = datetime.date(2020,1,19)
day3 = datetime.date(2020,1,31)
print(is_workday(day1)) # False
print(is_holiday(day1)) # True
print(is_workday(day2)) # True
print(is_workday(day3)) # False

2020-01-18是正常周日,所以不是工作日;2020-01-19是春节调休的工作日;2020-01-31是正月初七,是受今年新冠疫情影响延长的春节假期,也不算工作日。是不是很厉害,连这个都可以识别。有了它,我们就可以轻松识别我们的节假日了。
下面计算两个日期间的工作日天数:

def workdays(start,end):
    '''
    计算两个日期间的工作日
    start:开始时间
    end:结束时间
    '''
    from datetime import datetime,timedelta
    from chinese_calendar import is_workday
     # 字符串格式日期的处理
    if type(start) == str:
        start = datetime.strptime(start,'%Y-%m-%d').date()
    if type(end) == str:
        end = datetime.strptime(end,'%Y-%m-%d').date()
    # 开始日期大,颠倒开始日期和结束日期
    if start > end:
        start,end = end,start
    counts = 0
    while True:
        if start > end:
            break
        if is_workday(start):
            counts += 1
        start += timedelta(days=1)
    return counts

封装函数workdays(start,end)。可以接受形式为’%Y-%m-%d’字符串格式或日期格式的日期。下面运行看一下效果:

print(workdays('2020-01-19','2020-01-24'))
# 5
from datetime import date
print(workdays(date(2020,1,19),date(2020,1,24))) # 5

2020-01-19是调休工作日,所以一共是5天。
计算交易日天数:

def tradedays(start,end):
    '''
    计算两个日期间的工作日
    start:开始时间
    end:结束时间
    '''
    from datetime import datetime,timedelta
    from chinese_calendar import is_holiday
    # 字符串格式日期的处理
    if type(start) == str:
        start = datetime.strptime(start,'%Y-%m-%d').date()
    if type(end) == str:
        end = datetime.strptime(end,'%Y-%m-%d').date()
    # 开始日期大,颠倒开始日期和结束日期
    if start > end:
        start,end = end,start
        
    counts = 0
    while True:
        if start > end:
            break
        if is_holiday(start) or start.weekday()==5 or start.weekday()==6:
            start += timedelta(days=1)
            continue
        counts += 1
        start += timedelta(days=1)
    return counts

这里主要是需要排除所有的节假日和周六日。
运行看下效果:

print(tradedays('2020-01-19','2020-01-24')) # 4
from datetime import date
print(workdays(date(2020,1,24),date(2020,1,19))) # 5

因为2020-01-19虽然是工作日,但是是周日,所以不算交易日。
两个函数一个是计算工作日,一个计算交易日,都可以直接拿去使用,注意传参的格式,或者自行进行修改使用。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ethan-running

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值