跳过休息日(周末和节假日)
日期计算跳过周末
使用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-01
到 2022-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天工作日
跳过休息日(周末和节假日)相关推荐
- 判断请假时间去除周末及节假日
公司业务需求,在请假时自动跳过周六周日以及节假日.通过statisticsOfLeaveTime方法,传入请假开始的时间以及请假结束的时间,则可自动统计调休时间. 代码整体逻辑就为拿到请假开始和结束时 ...
- C#判断某天是否是周末或者节假日示例
/// <summary> /// 判断是不是周末/节假日 /// </summary> /// <param name="date">日期&l ...
- 节日代码php,php 排除周末与节假日程序实例代码
0 ){//周余凑整 $tmp = $weekday + $remain; if( $tmp >= 7 ){ $newoffset += 2; }else if( $tmp == 6 ){ $n ...
- java计算时间的秒数差,去掉周末和节假日
java计算时间的秒数差,去掉周末和节假日 如题所说,计算两个时间的秒数(工作日),拿到这个需求,首先想到的就是怎么去掉周末和节假日,或者两个时间有一个在周末或节假日,或者两个时间都在,要分别进行处理 ...
- php判断是否节假日,php 排除周末与节假日程序实例代码
date_default_timezone_set('prc');/*** 求取从某日起经过一定天数后的日期,* 排除周六周日和节假日* @param $start 开始日期* @para ...
- 【2022年法定工作日,周末,节假日类型使用Java存入sql】
2022年法定工作日,周末,节假日类型Json使用Java存入sql 实体类 枚举类 json串 Sql语句 Json下载链接:https://download.csdn.net/download/M ...
- java获取n个工作日后的日期, 排除周末和节假日(顺延)
java获取n个工作日后的日期, 排除周末和节假日(顺延) 一.需求分析 需求描述 思路解析 二.以下为测试代码(测试时日期为2018-08-28) 三.应用 1.首先看一下我数据库中存放的holid ...
- php获取N天后的日期,排除周末与节假日加上调休日
php获取N天后的日期,排除周末与节假日加上调休日 代码如下. /** * 求取从某日起经过一定天数后的日期, * 排除周六周日和节假日加上调休日 * @param $start int|string ...
- 统计工时,如何精确到工作天(剔除周末和节假日)
工作流功能中有一个比不可少的功能,就是工时统计.一个流程从发起到审批花费了多少时间,每个审批节点之间花费了多少时间.这也是KPI考核的一个利器. 有些企业比较大,不同的部门上下班时间不一样,有些还 ...
最新文章
- 软件系统理想主义之殇
- matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同
- 用计算机改手机电量,手机电池使用时间增加
- c++动态绑定和动态绑定
- python生成随机数代码_Python中产生随机数
- 封神-核心功能 | 钉钉告警+数据网关
- linux系统每月定时重启,linux系统定时重启.doc
- (20)System Verilog接口interface设计示例
- .NET 排序 Array.Sort<T> 实现分析
- linux 2.6线程创建源码分析
- java6不支持tlsv1.2_解决 JDK1.7 不支持 VCenter 6.7 的问题(涉及到Https TLS1.2协议)
- MyBatis_Study_004(动态代理)
- Toshiba Folio + CWM +CM
- 破解烽火移动HG6201M 破解 超级密码
- codeforces 1013 A Piles With Stones
- git回退版本 简单易懂
- sinc插值原理及其实现
- Matlab二值图像栅格化和圆域范围框定
- 腾讯云服务器到期未续费,CVM实例被释放还能找回文件吗?
- Python中的复数和误区