python实现自动计算排工期

一、需求说明

如果大家涉及到项目管理的话,那么一定逃不掉规划工期。由于在规划工期的时候需要考虑将法定节假日和周六日进行去除,所以许多人都会打开日历,一天一天的去计算。这样效率即慢,同时也容易出现错误,那么如何快速实现工期的排定呢?

假设开发的过程和顺序如下(其他行业的当然也可以自行调整):

开发➡️测试➡️辅助测试➡️预上线测试➡️提审➡️上线


二、需求分析

1.任务并行和串行情况

测试&UI跟测&产品跟测由于任务性质为并行,其他的都为串行

①UI跟测开始时间=测试开始时间

②产品跟测结束时间=测试结束时间

备注:所有的开始和结束时间都算作正常的工期内

2.工作日计算方式

需去除国家法定家假日和周六日

三、程序实现

1.运行环境

win10+pthon3.9.6+pycharm2020.1.1

2.三方库

①chinese_calendar:主要使用其is_workday判断指定日期是否为节假日【chinese_calendar为2024年11月30日导入的最新版本,后续若想使用最新的法定节假日,可自行更新版本】

②datetime:用于转化日期

③openpyxl:用于导出excel

3.实现步骤

3.1初始化开始时间和各阶段所需工期

kaifa_start_date = datetime.date(2024, 12, 2)#开发开始时间
kaifa_workdays = 12 #开发时间
ceshi_workdays = 8 #测试时间
uitest_workdays = 3 #UI跟测时间
pmtest_workdays = 3 #产品跟测时间
fuzhutest_workdays = 3 #辅助测试时间
yushangxiantest_workdays = 1 #预上线测试时间
tishen_workdays = 1 #提审时间
shangxian_workdays =1 #上线时间

3.2书写工具方法(主要是计算工作日加减)

#1.计算两个日期内的工作日天数
def count_workdays(start_date, end_date):
workdays = 0
current_date = start_date
while current_date <= end_date:
if is_workday(current_date):
workdays += 1
current_date += datetime.timedelta(days=1)
return workdays
#2.在当前日期的基础上,增加固定的工作日(不含周六日和法定节假日)
def add_workdays(start_date, workdays):
current_date = start_date
workdays -= 1
while workdays >0 :
current_date += datetime.timedelta(days = 1)
if is_workday(current_date):
workdays -= 1
return current_date
#3.在当前日期的基础上,减少固定的工作日(不含周六日和法定节假日)
def reduce_workdays(end_date, workdays):
current_date = end_date
while workdays > 0:
current_date -= datetime.timedelta(days = 1)
if is_workday(current_date):
workdays -= 1
return current_date

3.3计算和存储所有开发的时间

dict_array = []
#开发时间
kaifa_end_date = add_workdays(kaifa_start_date,kaifa_workdays)
dict_array.append({"阶段名称":"开发","开始时间":kaifa_start_date,"结束时间":kaifa_end_date,"当前状态":"进行中","工作日":kaifa_workdays})
#测试环境测试时间
ceshi_start_date = add_workdays(kaifa_end_date,2)
ceshi_end_date = add_workdays(ceshi_start_date,ceshi_workdays)
dict_array.append({"阶段名称":"测试环境测试","开始时间":ceshi_start_date,"结束时间":ceshi_end_date,"当前状态":"进行中","工作日":ceshi_workdays})
#UI跟测时间
ui_start_date = add_workdays(ceshi_start_date,1)
ui_end_date = add_workdays(ui_start_date,uitest_workdays)
dict_array.append({"阶段名称":"UI人员跟测","开始时间":ui_start_date,"结束时间":ui_end_date,"当前状态":"进行中","工作日":uitest_workdays})
#产品跟测时间
pm_end_date = ceshi_end_date
pm_start_date = reduce_workdays(ceshi_end_date,pmtest_workdays-1)
dict_array.append({"阶段名称":"产品人员跟测","开始时间":pm_start_date,"结束时间":pm_end_date,"当前状态":"进行中","工作日":pmtest_workdays})
#辅助测试时间
fuzhutest_start_date = add_workdays(ceshi_end_date,2)
fuzhutest_end_date = add_workdays(fuzhutest_start_date,fuzhutest_workdays)
dict_array.append({"阶段名称":"辅助测试","开始时间":fuzhutest_start_date,"结束时间":fuzhutest_end_date,"当前状态":"进行中","工作日":fuzhutest_workdays})
#预上线测试时间
yushangxiantest_start_date = add_workdays(fuzhutest_end_date,2)
yushangxiantest_end_date = add_workdays(yushangxiantest_start_date,yushangxiantest_workdays)
dict_array.append({"阶段名称":"准线上环境测试","开始时间":yushangxiantest_start_date,"结束时间":yushangxiantest_end_date,"当前状态":"进行中","工作日":yushangxiantest_workdays})
#提审时间
tishen_start_date = add_workdays(yushangxiantest_end_date,2)
tishen_end_date = add_workdays(tishen_start_date,tishen_workdays)
dict_array.append({"阶段名称":"提审","开始时间":tishen_start_date,"结束时间":tishen_end_date,"当前状态":"进行中","工作日":tishen_workdays})
#上线时间
shangxian_start_date = add_workdays(tishen_end_date,2)
shangxian_end_date = add_workdays(shangxian_start_date,shangxian_workdays)
dict_array.append({"阶段名称":"上线","开始时间":shangxian_start_date,"结束时间":shangxian_end_date,"当前状态":"进行中","工作日":shangxian_workdays})

3.4将所有的数据导出到excel

wb = Workbook()
ws = wb.active
ws.title = "Date Sheet"
ws.append(["阶段名称", "开始时间", "结束时间", "当前状态", "工作日"])
index = 0
while index < len(dict_array):
ws[f'A{index+2}'] = dict_array[index].get("阶段名称")
ws[f'B{index+2}'] = dict_array[index].get("开始时间")
ws[f'C{index+2}'] = dict_array[index].get("结束时间")
ws[f'D{index+2}'] = dict_array[index].get("当前状态")
ws[f'E{index+2}'] = dict_array[index].get("工作日")
# print(dict_array[index])
index += 1
# 保存工作簿
wb.save("工期.xlsx")

四、程序运行

后续每次只需要修改3.1初始化开始时间和各阶段所需工期参数,然后运行即可,将工期.xlsx文件拷贝出去即可,希望能够帮助到大家。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

狐说PM

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

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

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

打赏作者

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

抵扣说明:

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

余额充值