禅道统计BUG解决时长过滤节假日和跨天问题
之前发过禅道的各种数据统计报表,使用过程中优化了一些,反映最多的是项目bug的解决时长统计问题:
1.比如当天下班左右提交的bug,研发第二天来解决,晚上这段时间应该去掉,不应计算在内
2.节假日、周末这些时间也应该去掉
python有公用模块chinesecalendar可以解决解决第二个问题,不过这个模块有个缺陷,每年需要更新一下,获取当年的节假日,当然你也可以把节假日周末信息存入数据库动态调整获取。
common_workday.py 计算两个时间内的休息日天数
1 ##common_workday.py 2 3 4 # coding = utf-8 5 # 计算周末、节假日时间天数 6 7 from datetime import datetime, timedelta 8 from chinese_calendar import is_workday 9 10 11 def workdays(start, end): 12 """ 13 :param start: 14 :param end: 15 :return: 16 """ 17 # 字符串格式日期的处理 18 if type(start) == str: 19 start = datetime.strptime(start, '%Y-%m-%d').date() 20 if type(end) == str: 21 end = datetime.strptime(end, '%Y-%m-%d').date() 22 # 开始日期大,颠倒开始日期和结束日期 23 if start > end: 24 start, end = end, start 25 counts = 0 26 while True: 27 if start > end: 28 break 29 # 计算两个日期间的节假日和周末数 30 if is_workday(start) is False: 31 counts += 1 32 start += timedelta(days=1) 33 return counts
bug_time_summary.py 统计汇总时间(从数据库查询出数据后直接处理)
## bug_time_summary.py ##*****代码片段*****## mysql_l = deal_mysql(sys._getframe()) if len(mysql_l) > 0: le = [] for i in mysql_l: le.append(list(i)) for i in le: # bug解决时间减去bug提交时间 ta = round(float((i[7] - i[6]).total_seconds() / 3600), 2) # 两个时间之间的周末、节假日天数 tb = float(workday.workdays(i[6].date(), i[7].date()) * 24) hour_sub = 0 if i[6].day != i[7].day and i[6].hour >= 17: # 17点后提交的bug,计算需扣除的跨天小时数【8.5:计算方式自己动态调整,9点上班,考虑有人8点半来就修复bug了,所以取个8.5,提交bug分钟数舍弃计算,影响不大;另外17点之前提交的bug,不排除跨天时间】 hour_sub = 24 - i[6].hour + 8.5 # 最终结果 time_subtract = round(ta - tb - hour_sub, 2) i.append(time_subtract) end = [] name = '' count = 0 avg_time = 0 for index, i in enumerate(le): if index == 0: name = i[5] count = 1 avg_time = i[8] else: if i[5] == name: count += 1 avg_time += i[8] if index == len(le) - 1: end.append([le[index][0], le[index][1], le[index][5], count, round(avg_time / count, 2)]) else: end.append([le[index - 1][0], le[index - 1][1], le[index - 1][5], count, round(avg_time / count, 2)]) name = i[5] count = 1 avg_time = i[8] if index == len(le) - 1: end.append([le[index][0], le[index][1], le[index][5], count, round(avg_time / count, 2)]) sum_p = 0 sum_time = 0 for i in end: sum_p += i[3] sum_time += i[4]*i[3] avn = round(sum_time / sum_p, 2) end = sorted(end, key=lambda x: x[3], reverse=True) data = np.tile(end, 1) d = data.T # 获取列表合并算法 al = dt.find_same_column(d, 1) # td 处理 td = deal_td(al) # tr处理 tr = deal_tr(td) s, h = deal_html(tr, avn) ##*****代码片段*****##
改进前:
改进后:
同样的详情表也可以这样处理~~
本文来自博客园,作者:drewgg,转载请注明原文链接:https://www.cnblogs.com/drewgg/p/13261106.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义