Excel计算项目排期(含工作日、调休日)

一、生成所有的假日

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”(注:某些在线表格中只能使用双引号,用单引号不会返回结果)表示没有周末(打工人泪目),然后将所有的“可休息周末”和法定节假日列出来,放到公式中的”[节假日]”中,这样计算出来的排期就包含了调休的日期了。
具体效果如下:
notion imagenotion image
只需填写每个环节的开始时间和所需天数,就会自动生成每个环节的结束时间。
如果下一环节的开始时间与上一环节的结束时间相连,则下一环节的开始时间也可以使用公式自动生成。

三、计算日期之间的工作日

计算两个日期之间的工作日,不包括默认周末: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]的使用方法和上文提到的相同
 
 
If you have any questions, please contact me.