脚本如何生成考勤记录

wen 实用脚本 30

本文目录导读:

脚本如何生成考勤记录

  1. 核心思路
  2. 方法一:Python 脚本(最灵活,推荐)
  3. 方法二:Excel 公式(无需编程)
  4. 方法三:Python + 钉钉/企业微信 API(真实场景)
  5. 方法四:Shell 脚本(Linux/Mac 批量生产文本记录)
  6. 一些高级需求
  7. 需要注意的点

生成考勤记录脚本通常需要根据你使用的考勤设备(如钉钉、企业微信、指纹机)或数据来源(Excel、数据库)来定制。

下面提供几种通用的脚本思路和示例,你可以根据自己的技术栈(Python、Excel公式、Shell)选择。

核心思路

  1. 定义规则:上班时间(9:00)、下班时间(18:00)、迟到阈值、早退阈值、加班规则。
  2. 生成数据:使用随机数或循环生成一个月每天的打卡时间。
  3. 判断结果:根据规则将时间戳归类为 正常/迟到/早退/缺卡。
  4. 输出:导出为 CSV/Excel 或直接写入数据库。

Python 脚本(最灵活,推荐)

这个脚本可以生成指定年份、月份的随机考勤记录,并自动判别状态。

import pandas as pd
import random
from datetime import datetime, timedelta, date
import calendar
def generate_attendance(year, month, emp_name="张三"):
    # 1. 定义规则
    ON_TIME = datetime.strptime("09:00", "%H:%M").time()
    OFF_TIME = datetime.strptime("18:00", "%H:%M").time()
    LATE_THRESHOLD = 15   # 迟到容忍分钟数(超过9:15算迟到)
    EARLY_THRESHOLD = 15  # 早退容忍分钟数(17:45前走算早退)
    records = []
    # 2. 获取该月所有工作日(周一至周五)
    for day in range(1, calendar.monthrange(year, month)[1] + 1):
        current_date = date(year, month, day)
        if current_date.weekday() >= 5:  # 跳过周末
            continue
        # 3. 模拟随机打卡时间(随机迟到或早退)
        # 上班打卡:70%概率准时,20%概率迟到5-30分钟,10%概率忘记打卡
        rand_late = random.choices(
            [0, 1, None],  # None代表缺卡
            weights=[0.7, 0.2, 0.1],
            k=1
        )[0]
        if rand_late == 0:  # 准时
            punch_in = datetime.combine(current_date, ON_TIME) + timedelta(minutes=random.randint(-5, 5))
        elif rand_late == 1:  # 迟到
            punch_in = datetime.combine(current_date, ON_TIME) + timedelta(minutes=random.randint(15, 60))
        else:  # 缺卡
            punch_in = None
            # 下班打卡:逻辑类似
        rand_early = random.choices(
            [0, 1, None],
            weights=[0.75, 0.15, 0.10],
            k=1
        )[0]
        if rand_early == 0:  # 正常下班
            punch_out = datetime.combine(current_date, OFF_TIME) + timedelta(minutes=random.randint(0, 30))
        elif rand_early == 1:  # 早退
            punch_out = datetime.combine(current_date, OFF_TIME) - timedelta(minutes=random.randint(30, 120))
        else:  # 缺卡
            punch_out = None
        # 4. 判断状态
        status = "正常"
        if punch_in is None and punch_out is None:
            status = "全天缺卡"
        elif punch_in is None:
            status = "上班缺卡"
        elif punch_out is None:
            status = "下班缺卡"
        else:
            if punch_in.time() > datetime.strptime("09:15", "%H:%M").time():
                status = "迟到"
            if punch_out.time() < datetime.strptime("17:45", "%H:%M").time():
                status = "早退" if status == "正常" else status + "+早退"
        records.append({
            "日期": current_date,
            "星期": current_date.strftime("%A"),
            "上班打卡": punch_in.strftime("%H:%M:%S") if punch_in else "未打卡",
            "下班打卡": punch_out.strftime("%H:%M:%S") if punch_out else "未打卡",
            "状态": status
        })
    # 5. 导出为Excel
    df = pd.DataFrame(records)
    filename = f"考勤记录_{year}_{month}_{emp_name}.xlsx"
    df.to_excel(filename, index=False)
    print(f"考勤记录已生成: {filename}")
    return df
# 使用示例
if __name__ == "__main__":
    generate_attendance(2024, 3)  # 生成2024年3月的数据

Excel 公式(无需编程)

如果你不想写代码,可以在 Excel 里用公式快速生成。

  1. 准备日期列:A列填入日期(使用 =DATE(2024,3,ROW(A1)) 下拉)。
  2. 生成上班打卡时间
    • =A2 + TIME(9, IF(RAND()<0.8, 0, RANDBETWEEN(1,30)), 0)
    • 公式含义:80%概率9:00整,20%概率迟到1-30分钟。
  3. 生成下班打卡时间
    • =A2 + TIME(18, IF(RAND()<0.8, 0, RANDBETWEEN(1,30)), 0)
  4. 判断状态
    • 增加一列:=IF(B2-TIME(9,15,0)>0, "迟到", "正常")

缺点:每次重新计算(按F9)数据都会变,不固定,需要复制粘贴为值。


Python + 钉钉/企业微信 API(真实场景)

如果你是从真实的打卡系统导出数据,但需要模拟生成测试数据,可以构造 JSON 格式:

import json
import hashlib
import time
# 模拟钉钉打卡记录JSON结构
records = []
for i in range(1, 23):  # 工作日
    record = {
        "userId": "manager1234",
        "checkDate": f"2024-03-{i:02d}",
        "checkTime": f"09:{random.randint(0,59):02d}:{random.randint(0,59):02d}",
        "checkType": "OnDuty",
        "locationResult": "Normal",
        "sourceType": "USER_CHECK"
    }
    records.append(record)
# 存储为JSON文件
with open('dingtalk_attendance.json', 'w') as f:
    json.dump(records, f, indent=2)

Shell 脚本(Linux/Mac 批量生产文本记录)

适合生成简单的 CSV 文本文件。

#!/bin/bash
# generate_attendance.sh
echo "日期,上班时间,下班时间,状态"
for day in $(seq -w 1 28); do
    # 模拟时间
    in_time="09:0$((RANDOM % 6)):00"   # 09:00~09:05或09:1x
    out_time="18:3$((RANDOM % 6)):00"  # 18:30~18:35
    status="正常"
    if [ "$in_time" \> "09:15:00" ]; then
        status="迟到"
    fi
    echo "2024-03-${day},${in_time},${out_time},${status}"
done

一些高级需求

  1. 生成实时随机数据(用于测试):直接用 Python + datetime.now() 随机偏移。
  2. 配合排班系统:加入白班/夜班/倒班逻辑(修改 ON_TIMEOFF_TIME 变量)。
  3. 生成批量员工:循环员工列表,每个员工生成独立的 Sheet。

需要注意的点

  • 随机性:真实考勤不会每天都是完美的随机分布(月初、月末往往更准时),可以增加权重调整。
  • 节假日:上面的代码已经跳过周末,但法定节假日(如国庆)需要额外处理(可以用 chinese_calendar 库)。
  • 数据隐私:生成的测试数据不要包含真实员工姓名,建议用 员工001 代替。

如果你能告诉我你使用的具体工具(钉钉?Excel?数据库?)以及生成数据的用途(测试?分析?),我可以提供更精确的代码。

抱歉,评论功能暂时关闭!