当前位置: 首页 > article >正文

python实现自动计算排工期

3be70d7c0e52d4683c596416079b5e7f.jpeg

一、需求说明

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

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

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

0609344212a412f9b499456357c8abbc.jpeg
二、需求分析

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文件拷贝出去即可,希望能够帮助到大家。

92ab24fd608466abd05e2a60801fbeff.jpeg


http://www.kler.cn/a/417489.html

相关文章:

  • go流程控制
  • Centos 8 离线升级openssh 9.9
  • IDEA使用Auto-dev+DeepSeek 10分钟快速集成,让java开发起飞
  • hot100(8)
  • 2025职业发展规划
  • DeepSeek 部署过程中的问题
  • 如何通过 ADB 安装 xapk
  • 【前端】Vue3+Vite如何进行多环境配置呢
  • Cobalt Strike 4.8 用户指南-第十一节 C2扩展
  • OpenAI Whisper 语音识别 模型部署及接口封装
  • AOSP的同步问题
  • gitee:创建仓库,存入本地文件至仓库
  • k8s Init:ImagePullBackOff 的解决方法
  • go-zero使用自定义模板实现统一格式的 body 响应
  • 如何利用Java爬虫获取1688关键词接口数据
  • Linux常用操作之vim快捷操作
  • 【QNX+Android虚拟化方案】129 - USB眼图参数配置
  • Unity ShaderLab 实现3D物体描边
  • Mybatis:CRUD数据操作之单条件查询
  • YOLO模型训练后的best.pt和last.pt区别
  • HTML技术深度解析:构建现代网页的基石
  • redis-bitmap使用详解
  • kubernetes——part3-2 集群声明式文件YAML
  • STL简介
  • 短视频账号矩阵系统源码--独立saas技术部署
  • 计算机视觉工程师紧张学习中!