一、效果展示
1.實現效果
2.原始數據模板
二、代碼詳解
1.導入庫
2.定義時間處理函數
3.讀取數據調整日期格式
4.計算工作日天數
5.獲取缺卡名單
不管是上學還是上班都會統計考勤,有些學校或公司會對每月缺卡次數過多(比如三次以上)的人員進行處罰。
有些公司還規定對於基層員工要在工作日提交日志、管理人員要提交周報或月報,對於少提交的人員要進行處罰。
如果公司HR逐個對人員的日志或缺卡數據進行處理,將是一項耗時且無聊的工作。
本文提供了自動處理考勤和日志缺失的方法。
不用安裝Python,不用學Python語法,只要你會在電腦上新建文件夾,點擊文件就可以實現考勤和日志缺失名單的統計輸出。
接下來一起來看下實現步驟吧。
一、效果展示1.實現效果首先來看下實現效果。
大體實現步驟如下:
步驟1:在D盤中新建“每月缺卡數據處理“文件夾(已在代碼中固定死了,必須建該文件夾)。
步驟2:把處理考勤缺失的exe文件和原始數據文件放到step1新建的文件夾中。
步驟3:點擊exe文件,會自動出來csv結果文件,具體格式如下:
2.原始數據模板原始數據文件需為”判斷是否提交日志2.xlsx“,本文使用的原始數據如下(表頭需按如下命名):
注:如需本文原始數據、和直接運行得到結果的exe文件,可點擊鏈接獲取 提取碼vb6x
其中填報人指學生或員工姓名,部門若為學生可以填某某班。
填報時間指日志填報時間,日期指日志實際日期。若為考勤打卡,兩個日期都填實際打卡的日期即可。
若為考勤打卡,今日完成工作列可置為空。
如果原始文件中想存放員工打卡的全年數據,但想統計其中某個月的缺卡數據。
只需把想統計的月份放在日期的第一行即可,代碼中已按日期第一行進行了同年月數據子框的篩選。
如需設置定時任務,把運行結果定時郵件發送給相關人員,可以私信我。
二、代碼詳解對於部分了解Python的朋友來說,如果有個性化的需求,可以自己微調代碼實現需求。接下來詳細闡述實現上述功能的代碼。
1.導入庫首先導入本文需要加載的庫,如果你有些庫還沒有安裝,導致運行代碼時報錯,可以在Anaconda Prompt中用pip方法安裝。
# -*- coding: UTF-8 -*-'''代碼用途 :處理缺卡數據作者 :阿黎逸陽博客 : https://blog.csdn.net/qq_32532663/article/details/106176609'''import osimport calendarimport numpy as npimport pandas as pdfrom datetime import datetimefrom xlrd import xldate_as_tuplefrom chinese_calendar import is_workdayfrom chinese_calendar import is_holidayfrom chinese_calendar import get_holiday_detail
本文應用到了os、calendar、numpy、pandas、datetime、xlrd、chinese_calendar庫。
os庫可以設置文件讀取的位置。
calendar和chinese_calendar庫是日期處理庫。
numpy和pandas庫處理數據框。
xlrd和datetime庫處理時間。
2.定義時間處理函數接著應用xlrd和datetime庫中的函數定義時間處理函數,把時間戳或帶時分秒的時間轉換成只含年月日的時間。
def num_to_date(x): ''' 日期處理函數 把時間戳或帶時分秒的時間轉換成只含年月日的時間 ''' try: x1 = datetime(*xldate_as_tuple(x, 0)).strftime('%Y-%m-%d') except: x1 = datetime.date(x).strftime('%Y-%m-%d') return x1
定義成年月日統一時間的目的是為了方便後續代碼的運行。
3.讀取數據調整日期格式接著讀取數據,應用第二小節定義的時間處理函數把填報時間和日期進行處理。
#讀取數據os.chdir(r'D:\每月缺卡數據處理')date = pd.read_excel('判斷是否提交日志2.xlsx', sheet_name='Sheet1')#調整日期格式date['填報時間'] = date['填報時間'].apply(num_to_date)date['日期'] = date['日期'].apply(num_to_date)
原始部分數據如下:
調用時間處理函數得到的部分數據如下:
4.計算工作日天數接著取出數據框日期列的第一個值,獲取要統計的年月信息。根據年月信息獲取該月工作日的天數。
#取出想看缺卡信息的年月y_m1 = date['日期'][0][0:7] def sele_ym(x, y_m=y_m1): ''' 判斷數據框中的日期是否為某月 ''' if x.find(y_m)>=0: return True#找出這一個月中的工作日,求出工作日的天數days = calendar.Calendar().itermonthdates(int(y_m1.split('-')[0]), int(y_m1.split('-')[1])) mth_nwkdays = [] #非工作日mth_wkdays = [] #工作日mth_days = [] #全部日期for day in days: if str(day).find(y_m1)>=0: #print(str(day)) mth_days.append(str(day)) if is_workday(day)>0: mth_wkdays.append(str(day)) else: mth_nwkdays.append(str(day))work_days = len(mth_wkdays) #工作日天數
把工作天數和員工本月的實際打卡或寫日志的天數進行對比,如果實際值小於理論值,說明員工缺卡或請假了。
由於大部分的員工都是正常打卡或寫日志的,這時人工再對缺卡員工進行排查已經極大地縮小了排查面。
如有特殊代碼需求,需要求助的,可以到公眾號中私信我。
5.獲取缺卡名單最後調用函數獲取缺卡名單,主要是對每個填報日期和實際工作日期進行比對。
#定義獲取缺卡信息的函數def stat_dail_short(date, y_m1, work_days): ''' date:存儲日志的數據大表 y_m1:月份 work_days:該月的工作天數 ''' qk_file = [] date_m = date[date['日期'].apply(sele_ym)==True] for i in set(date_m['填報人']): sub_date = date_m[date_m['填報人'] == i] if len(sub_date['日期'])<work_days: qk = str(set(sub_date['填報人'])) + str(set(sub_date['部門'])) + '缺了'+ str((work_days-len(sub_date['日期']))) + '次卡' + ';缺卡日期為:'+ str(set(mth_wkdays)^set(sub_date['日期'])) qk_file.append(qk) print(set(sub_date['填報人']), set(sub_date['部門']), '缺了%d次卡'%(work_days-len(sub_date['日期'])), ';缺卡日期為:', set(mth_wkdays)^set(sub_date['日期']),sep='') qk_file_1 = pd.DataFrame(qk_file) qk_file_1.columns = ['缺卡信息'] qk_file_1.to_csv(y_m1+' 缺卡名單'+'.csv', encoding='gbk') #調用函數獲取缺卡名單stat_dail_short(date, y_m1, work_days)
得到結果:
{'張繼科'}{'體育部'}缺了5次卡;缺卡日期為:{'2022-04-11', '2022-04-29', '2022-04-22', '2022-04-18', '2022-04-21'}
{'楊紫'}{'歷劫部'}缺了1次卡;缺卡日期為:{'2022-04-20'}
{'劉詩雯'}{'體育部'}缺了2次卡;缺卡日期為:{'2022-04-18', '2022-04-28'}
結果中的數據是用填報人、填報部門、缺卡次數、具體的缺卡日期進行拼接展示的。會以csv的形式存放到指定文件夾中。
如果需要把姓名、部門、缺卡次數等信息分開,可以在excel中按特定條件分列,或調整一下代碼進行實現。
本文開頭的exe文件生成方法,可以參考下文
Pinstaller(Python打包為exe文件)
之前自己把 Python 文件打包成 exe 的時候,折騰了很久,本文將詳細地講述如何快速生成在不安裝 Python 的電腦上也能執行的文件
1. 在 prompt 中運行 pip install pyinstaller , 安裝 pyinstaller 庫
2. 在 prompt 中運行 where pyinstaller
3. 找到待打包文件存放的路徑
把要打包的文件放到找到的路徑
C:\Users\Administrator\Anaconda3\Scripts 中 (我的路徑是這個,你就按照第二步的路徑)
4. 調用 cmd 窗口
把待打包文件放在
C:\Users\Administrator\Anaconda3 \Scripts 目錄下,在該文件夾中按shift+鼠標右鍵 , 點擊 在此處打開命令窗口 調用 cmd
5. 在 cmd 中輸入 pyinstaller -F 文件名
例子:打包 Python 繪制皮卡丘的視頻,在cmd中輸入 pyinstaller -F pkq_1.py
即可生成普通圖標的exe可執行文件。
6. 生成 exe 文件
可以在路徑
C:\Users\Administrator\Anaconda3\Scripts 下的 dist 文件夾中找到打包好的exe文件(即不用安裝 Python 也可以運行的文件)。
這樣生成的文件圖標是標准固定格式,如果想生成特定特定形狀的圖標需要用第7點中的語句。
7. 生成自定義形狀的圖標,在cmd中輸入:pyinstaller -i ico路徑 -F xxxxx.py
例子: 打包 Python 繪制皮卡丘視頻的py文件,在cmd中輸入 (注: 我把ico圖標和待打包文件放到一個文件夾下了, 所以直接輸入了ico的名字)
pyinstaller -i pikaqiu2.ico -F pkq_1.py
生成圖標是皮卡丘形狀的exe文件。
我在生成exe的過程中一直有報錯,後面在網上看到方法說先在cmd中運行pip uninstall matplotlib,再運行生成exe的語句就不會報錯。
按網上方法真成功了,雖然沒有明白原理,但還是非常感謝!如果你在打包的時候沒有報錯,還是不建議刪除matplotlib庫。
到此這篇關於Python實現自動化處理每月考勤缺卡數據的文章就介紹到這了,更多相關Python處理考勤缺卡數據內容請搜索軟件開發網以前的文章或繼續浏覽下面的相關文章希望大家以後多多支持軟件開發網!