日期计算跳过周末

使用pandas计算一定日期内工作日的天数,周末天数,遇到周末向后延长对应天数

例如
'2022-06-2’到’2022-06-04’之间有一天不是工作日

def skip_weekend(start_date='2022-06-20', end_date='2022-06-27'):"""跳过周末(忽略节假日)"""import datetimeimport arrowimport pandas as pdif not isinstance(end_date, datetime.date):end_date = arrow.get(end_date).date()if not isinstance(start_date, datetime.date):start_date = arrow.get(start_date).date()everyday = (end_date - start_date).days + 1  # 每天weekday = len(pd.bdate_range(start_date, end_date))  # 工作日day_off = everyday - weekday  # 休息日new_start_date = arrow.get(end_date).shift(days=+1).date()new_end_date = arrow.get(end_date).shift(days=+day_off).date()def over_day(new_start_date, new_end_date, day_off):print(new_start_date, new_end_date, day_off)weekday = len(pd.bdate_range(new_start_date, new_end_date))print(weekday)new_day_off = day_off - weekdayprint(day_off)if new_day_off != 0:new_end_date = arrow.get(new_end_date).shift(days=+new_day_off).date()return over_day(new_start_date, new_end_date, day_off)return new_start_date, new_end_date, day_offnew_start_date, new_end_date, day_off = over_day(new_start_date, new_end_date, day_off)return start_date, new_end_date

实例

a, b = skip_days_off('2022-06-2', '2022-06-4')print(a, b)

输出结果

2022-06-02 2022-06-06

日期计算跳过休息日(包含周末和节假日)

使用pandas 自定义节假日规则,补班规则,一定日期内遇到节假日或者周末延后对应天数
例如
2022-10-012022-10-07 中间有 7天休息日;而且10月8日(星期六)、10月9日(星期日)上班

"""
获取地址:https://www.gov.cn/zhengce/content/2021-10/25/content_5644835.htm一、元旦:2022年1月1日至3日放假,共3天。二、春节:1月31日至2月6日放假调休,共7天。1月29日(星期六)、1月30日(星期日)上班。三、清明节:4月3日至5日放假调休,共3天。4月2日(星期六)上班。四、劳动节:4月30日至5月4日放假调休,共5天。4月24日(星期日)、5月7日(星期六)上班。五、端午节:6月3日至5日放假,共3天。六、中秋节:9月10日至12日放假,共3天。七、国庆节:10月1日至7日放假调休,共7天。10月8日(星期六)、10月9日(星期日)上班。
"""import arrow
import pandas as pd
from pandas.tseries.offsets import CustomBusinessDay
import datetimeclass SkipDaysOff:# 假期规则 国务院每年会发放假期通知 http://www.gov.cn/year = str(arrow.now().date().year)  # 当前年份holiday_rules = [year + '-01-01', year + '-01-02', year + '-01-03',year + '-01-31', year + '-02-01', year + '-02-02', year + '-02-03', year + '-02-04',year + '-02-05', year + '-02-06',year + '-04-03', year + '-04-04', year + '-04-05',year + '-04-30', year + '-05-01', year + '-05-02', year + '-05-03', year + '-05-04',year + '-06-03', year + '-06-04', year + '-06-05',year + '-09-10', year + '-09-11', year + '-09-12',year + '-10-01', year + '-10-02', year + '-10-03', year + '-10-04', year + '-10-05',year + '-10-06', year + '-10-07']# 额外工作日extra_workday = [year + '-01-29', year + '-01-30', year + '-04-02', year + '-04-24', year + '-05-07',year + '-10-08', year + '-10-09']c = CustomBusinessDay(holidays=holiday_rules)def count_workday(self, start_day, end_day):"""返回工作日天数,和休息日天数"""everyday = [i.strftime('%Y-%m-%d') for i in arrow.Arrow.range('day', start_day, end_day)]workday = len(pd.date_range(start=start_day, end=end_day, freq=self.c))extra_workday_len = len(set(everyday) & set(self.extra_workday))workday_num = workday+extra_workday_lenday_off_num = len(everyday) - workday_numreturn workday_num, day_off_numdef skip_days_off(self, start_date='2022-06-20', end_date='2022-06-27'):"""跳过休息日 结束日期=原结束日期+休息日(天数)"""if not isinstance(end_date, datetime.date):end_date = arrow.get(end_date).datetimeif not isinstance(start_date, datetime.date):start_date = arrow.get(start_date).datetime# 休息日天数day_off = self.count_workday(start_date, end_date)[1]# 新增加天数的开始时间new_start_date = arrow.get(end_date).shift(days=+1).datetime# 新增加天数的结束时间new_end_date = arrow.get(end_date).shift(days=+day_off).datetimedef over_day(new_start_date, new_end_date, day_off):"""新结束时间将一直增加新休息日;新增加天数中工作日天数等于缺少的休息日天数时,结束"""weekday = self.count_workday(new_start_date, new_end_date)[0]new_day_off = day_off - weekdayif new_day_off != 0:new_end_date = arrow.get(new_end_date).shift(days=+new_day_off).datetimereturn over_day(new_start_date, new_end_date, day_off)return new_start_date, new_end_date, day_offnew_start_date, new_end_date, day_off = over_day(new_start_date, new_end_date, day_off)return start_date.date(), new_end_date.date()

实例

a, b = SkipDaysOff().skip_days_off('2022-10-01', '2022-10-07')print(a, b)

输出结果

2022-10-01 2022-10-14

输出结果将,额外的工作日也计算进去了,跳过n天休息日,增加n天工作日

跳过休息日(周末和节假日)相关推荐

  1. 判断请假时间去除周末及节假日

    公司业务需求,在请假时自动跳过周六周日以及节假日.通过statisticsOfLeaveTime方法,传入请假开始的时间以及请假结束的时间,则可自动统计调休时间. 代码整体逻辑就为拿到请假开始和结束时 ...

  2. C#判断某天是否是周末或者节假日示例

    /// <summary> /// 判断是不是周末/节假日 /// </summary> /// <param name="date">日期&l ...

  3. 节日代码php,php 排除周末与节假日程序实例代码

    0 ){//周余凑整 $tmp = $weekday + $remain; if( $tmp >= 7 ){ $newoffset += 2; }else if( $tmp == 6 ){ $n ...

  4. java计算时间的秒数差,去掉周末和节假日

    java计算时间的秒数差,去掉周末和节假日 如题所说,计算两个时间的秒数(工作日),拿到这个需求,首先想到的就是怎么去掉周末和节假日,或者两个时间有一个在周末或节假日,或者两个时间都在,要分别进行处理 ...

  5. php判断是否节假日,php 排除周末与节假日程序实例代码

    date_default_timezone_set('prc');/*** 求取从某日起经过一定天数后的日期,* 排除周六周日和节假日* @param $start       开始日期* @para ...

  6. 【2022年法定工作日,周末,节假日类型使用Java存入sql】

    2022年法定工作日,周末,节假日类型Json使用Java存入sql 实体类 枚举类 json串 Sql语句 Json下载链接:https://download.csdn.net/download/M ...

  7. java获取n个工作日后的日期, 排除周末和节假日(顺延)

    java获取n个工作日后的日期, 排除周末和节假日(顺延) 一.需求分析 需求描述 思路解析 二.以下为测试代码(测试时日期为2018-08-28) 三.应用 1.首先看一下我数据库中存放的holid ...

  8. php获取N天后的日期,排除周末与节假日加上调休日

    php获取N天后的日期,排除周末与节假日加上调休日 代码如下. /** * 求取从某日起经过一定天数后的日期, * 排除周六周日和节假日加上调休日 * @param $start int|string ...

  9. 统计工时,如何精确到工作天(剔除周末和节假日)

    工作流功能中有一个比不可少的功能,就是工时统计.一个流程从发起到审批花费了多少时间,每个审批节点之间花费了多少时间.这也是KPI考核的一个利器.   有些企业比较大,不同的部门上下班时间不一样,有些还 ...

最新文章

  1. 软件系统理想主义之殇
  2. matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同
  3. 用计算机改手机电量,手机电池使用时间增加
  4. c++动态绑定和动态绑定
  5. python生成随机数代码_Python中产生随机数
  6. 封神-核心功能 | 钉钉告警+数据网关
  7. linux系统每月定时重启,linux系统定时重启.doc
  8. (20)System Verilog接口interface设计示例
  9. .NET 排序 Array.Sort<T> 实现分析
  10. linux 2.6线程创建源码分析
  11. java6不支持tlsv1.2_解决 JDK1.7 不支持 VCenter 6.7 的问题(涉及到Https TLS1.2协议)
  12. MyBatis_Study_004(动态代理)
  13. Toshiba Folio + CWM +CM
  14. 破解烽火移动HG6201M 破解 超级密码
  15. codeforces 1013 A Piles With Stones
  16. git回退版本 简单易懂
  17. sinc插值原理及其实现
  18. Matlab二值图像栅格化和圆域范围框定
  19. 腾讯云服务器到期未续费,CVM实例被释放还能找回文件吗?
  20. Python中的复数和误区

热门文章

  1. Python操作json文件
  2. Java泛型比较大小
  3. Android Studio 往虚拟机添加音乐
  4. 分段模糊隶属度的自定义python函数(线性插值原理)
  5. 2020 中信银行 软件开发中心 社招 8.23晚上在线笔试 进展讨论
  6. Git 修改前面提交commit的名字
  7. 详细解读大数据分析学习路线
  8. 四年级下册计算机技术做福字,四年级写福字作文
  9. 软件推荐 scrcpy
  10. 中国马铃薯全粉产业经营策略与销售渠道研究报告(2022-2027年)