Python实现自动化处理每月考勤缺卡数据

  • Post category:Python

下面是详细的Python实现自动化处理每月考勤缺卡数据的攻略。

一、前置条件

为了能够完整地实现该功能,需要满足以下前置条件:

  1. 对Python编程语言有一定的了解
  2. 安装Python的pandas和openpyxl包
  3. 存在考勤数据文件,且该文件的一行对应一条考勤记录,每行包含员工姓名、打卡时间、上下班标志等信息。

二、实现步骤

  1. 导入所需的包

在Python程序中,需要先导入以下两个包:

import pandas as pd
from openpyxl import load_workbook

其中,pandas和openpyxl分别用来处理数据和操作Excel文件。

  1. 读取考勤数据文件

考勤数据会存在如Excel文件等常规数据文件中,因此,需要使用pandas来读取该文件。

df = pd.read_excel(r'考勤数据.xlsx')
  1. 按月份进行筛选

一般来说,需要对每个月的考勤数据进行处理,因此,需要通过pandas的筛选功能,对考勤数据进行按月份的筛选。

month = '202201'
df['month'] = df['打卡时间'].apply(lambda x: str(x)[:6])
df = df[df['month']==month]

上述代码会创建一个新的’month’列,用来存储每条考勤记录的对应月份。之后,再根据’month’列进行筛选即可。

  1. 统计缺卡人员及缺卡时间

缺卡数据一般指某个员工的某天既没有上班打卡,也没有下班打卡。因此,需要对每个人每天的考勤记录进行统计,以确定缺卡时间。

def is_missed(row):
    if row['上班'] == 0 and row['下班'] == 0:
        return row['打卡时间'].strftime('%Y-%m-%d')
    return None

df['missed'] = df.apply(is_missed, axis=1)
missed_df = df.dropna(subset=['missed'], axis=0)

在上述代码中,首先定一个is_missed函数,用来判断考勤记录是否为缺卡数据。如果某个考勤记录确实为缺卡,那么就将该记录的日期保存在新的missed列中。最后,通过使用dropna函数来去掉missed列中的缺失值,即可得到所有的缺卡数据。

  1. 将缺卡数据写入Excel

最后,可以将所有的缺卡数据写入Excel中。

book = load_workbook(r'考勤缺卡统计.xlsx')
writer = pd.ExcelWriter(r'考勤缺卡统计.xlsx', engine='openpyxl')
writer.book = book

if 'Sheet1' in book.sheetnames:
    book.remove(book['Sheet1'])

missed_df.to_excel(writer, index=False)
writer.save()

在上述代码中,首先需要加载考勤缺卡统计的Excel文件,然后使用pandas将缺卡数据写入Excel。最后,保存Excel文件,即可完成自动化处理每月考勤缺卡数据。

三、示例说明

  1. 示例一:处理本月缺卡人员

假设现在需要处理2022年1月份考勤数据,可以通过执行以下代码来生成考勤缺卡统计表:

import pandas as pd
from openpyxl import load_workbook

df = pd.read_excel(r'考勤数据.xlsx')
month = '202201'
df['month'] = df['打卡时间'].apply(lambda x: str(x)[:6])
df = df[df['month']==month]

def is_missed(row):
    if row['上班'] == 0 and row['下班'] == 0:
        return row['打卡时间'].strftime('%Y-%m-%d')
    return None

df['missed'] = df.apply(is_missed, axis=1)
missed_df = df.dropna(subset=['missed'], axis=0)

book = load_workbook(r'考勤缺卡统计.xlsx')
writer = pd.ExcelWriter(r'考勤缺卡统计.xlsx', engine='openpyxl')
writer.book = book

if 'Sheet1' in book.sheetnames:
    book.remove(book['Sheet1'])

missed_df.to_excel(writer, index=False)
writer.save()

执行上述代码后,程序会自动读取考勤数据文件,并根据2022年1月份的打卡记录,筛选出该月的考勤数据。然后,通过is_missed函数判断每条考勤记录是否为缺卡数据,最后,将所有的缺卡数据保存在Excel文件中。

  1. 示例二:快速处理多个月份的考勤缺卡数据

如果需要处理多个月份的考勤缺卡数据,可以将上述代码封装成一个函数,然后循环调用该函数即可。具体实现代码如下所示:

import pandas as pd
from openpyxl import load_workbook

def handle_missed_data(file_path, month):
    df = pd.read_excel(file_path)
    df['month'] = df['打卡时间'].apply(lambda x: str(x)[:6])
    df = df[df['month']==month]

    def is_missed(row):
        if row['上班'] == 0 and row['下班'] == 0:
            return row['打卡时间'].strftime('%Y-%m-%d')
        return None

    df['missed'] = df.apply(is_missed, axis=1)
    missed_df = df.dropna(subset=['missed'], axis=0)

    book = load_workbook(r'考勤缺卡统计.xlsx')
    writer = pd.ExcelWriter(r'考勤缺卡统计.xlsx', engine='openpyxl')
    writer.book = book

    if 'Sheet1' in book.sheetnames:
        book.remove(book['Sheet1'])

    missed_df.to_excel(writer, index=False)
    writer.save()

file_path = r'考勤数据.xlsx'
months = ['202201', '202202', '202203']

for month in months:
    handle_missed_data(file_path, month)

该代码会执行以下操作:

  1. 读取考勤数据文件
  2. 循环遍历每个月份
  3. 根据月份筛选出考勤数据
  4. 统计缺卡人员及缺卡时间
  5. 将缺卡数据写入Excel。

通过执行上述代码,可以比较快速地处理多个月份的考勤缺卡数据。