Excel项目排期(含调休)
type
Post
status
Published
summary
使用Excel中的WORKDAYS(起始日期, 天数,[节假日]) 或 WORKDAYS.INTL(起始日期, 天数,[周末类型],[节假日])公式搞定节假日调休日的项目排期。
slug
excel-schdule
date
Nov 21, 2022
tags
Excel
项目排期
category
实践技巧
password
icon
URL
Property
Feb 28, 2024 01:08 PM
一、生成所有的假日
Excel中计算项目排期的公式可以使用:WORKDAYS(起始日期, 天数,[节假日]) 或 WORKDAYS.INTL(起始日期, 天数,[周末类型],[节假日]);
但由于中国的法定节假日是有调休的,所以需要使用WORKDAYS.INTL来自定义所有节假日;
于是,这个方法的重点就转换为如何列出“可休息周末”和法定节假日;
- 法定节假日不多,可以手动操作;
- “可休息周末”需要列出项目周期内的所有正常周末,然后删除调休的周末即可。
这里需要使用python来打印所有周末日期,具体代码如下:
import datetime as dt def print_week(start_date,end_date): end_d_i = start_d = dt.datetime.strptime(start_date,'%Y-%m-%d') end_d = dt.datetime.strptime(end_date,'%Y-%m-%d') if (start_d - end_d).days == 0: print('开始日期和结束日期相同,请检查输入日期!!!') elif (start_d - end_d).days > 0: print('开始日期和结束日期是不是写反了,请检查输入日期!!!') else: while True: if (end_d_i - end_d).days >= 0: break else: if end_d_i.weekday() in [5,6]: print(end_d_i.strftime('%Y-%m-%d')) end_d_i += dt.timedelta(days=1) print_week('2022-11-29','2022-11-28')
通过以上代码,就能打印出两个日期之间的周末,再手动摘除需要调休的日期,剩下的就是“可休息周末”。
二、计算截止日期
将“可休息周末”和法定节假日复制到excel中,再使用WORKDAYS.INTL(起始日期, 天数,[周末类型],[节假日])公式,即可实现包含调休日的排期。
函数:WORKDAYS.INTL(起始日期, 天数,[周末类型],[节假日]),[周末类型]可以是数字也可以是字符串:
数字表示的含义如下:
数字 | 1或省略 | 2 | 3 | 4 | 5 | 6 | 7 |
定义周末 | 周六、周日 | 周日、周一 | 周一、周二 | 周三、周四 | 周三、周四 | 周四、周五 | 周五、周六 |
数字 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
定义周末 | 仅周日 | 仅周一 | 仅周二 | 仅周三 | 仅周四 | 仅周五 | 仅周六 |
字符串含义如下:
字符串长度为七个字符,并且字符串中的每个字符表示一周中的一天(从星期一开始)。 1 表示非工作日,0 表示工作日。 在字符串中仅允许使用字符 1 和 0。 例如,0000011 结果为星期六和星期日是周末。
回到正题,我们这里将公式的“周末类型”设置为”0000000”(注:某些在线表格中只能使用双引号,用单引号不会返回结果)表示没有周末(打工人泪目),然后将所有的“可休息周末”和法定节假日列出来,放到公式中的”[节假日]”中,这样计算出来的排期就包含了调休的日期了。
具体效果如下:
只需填写每个环节的开始时间和所需天数,就会自动生成每个环节的结束时间。
如果下一环节的开始时间与上一环节的结束时间相连,则下一环节的开始时间也可以使用公式自动生成。
三、计算日期之间的工作日
计算两个日期之间的工作日,不包括默认周末:NETWORKDAYS(start_date,end_date)
计算两个日期之间的工作日,不包括周末和节假日:NETWORKDAYS(start_date, end_date, [holidays])
计算两个日期之间的工作日,不包括自定义周末:NETWORKDAYS.INTL(start_date, end_date, [weekend])
计算两个日期之间的工作日,不包括自定义的周末和节假日:NETWORKDAYS.INTL(start_date, end_date, [weekend], [holidays])
其中[weekend]的使用方法和上文提到的相同