首頁 > 軟體

Python實現自動化處理每月考勤缺卡資料

2022-06-27 18:01:35

不管是上學還是上班都會統計考勤,有些學校或公司會對每月缺卡次數過多(比如三次以上)的人員進行處罰。

有些公司還規定對於基層員工要在工作日提交紀錄檔、管理人員要提交週報或月報,對於少提交的人員要進行處罰。

如果公司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 os
import calendar
import numpy as np
import pandas as pd
from datetime import datetime
from xlrd import xldate_as_tuple
from chinese_calendar import is_workday
from chinese_calendar import is_holiday
from 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:UsersAdministratorAnaconda3Scripts 中 (我的路徑是這個,你就按照第二步的路徑)

4.  呼叫 cmd 視窗

把待打包檔案放在

C:UsersAdministratorAnaconda3 Scripts 目錄下,在該資料夾中按shift+滑鼠右鍵 , 點選 在此處開啟命令視窗 呼叫 cmd 

5.  在 cmd 中輸入 pyinstaller -F  檔名

例子:打包 Python 繪製皮卡丘的視訊,在cmd中輸入 pyinstaller -F  pkq_1.py

即可生成普通圖示的exe可執行檔案。

6.  生成 exe 檔案

可以在路徑

C:UsersAdministratorAnaconda3Scripts 下的 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處理考勤缺卡資料內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com