之前發過禪道的各種數據統計報表,使用過程中優化了一些,反映最多的是項目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) ##*****代碼片段*****##
改進前:

改進后:

同樣的詳情表也可以這樣處理~~
