本文目录导读:

- 核心思路
- 方法一:Python 脚本(最灵活,推荐)
- 方法二:Excel 公式(无需编程)
- 方法三:Python + 钉钉/企业微信 API(真实场景)
- 方法四:Shell 脚本(Linux/Mac 批量生产文本记录)
- 一些高级需求
- 需要注意的点
生成考勤记录脚本通常需要根据你使用的考勤设备(如钉钉、企业微信、指纹机)或数据来源(Excel、数据库)来定制。
下面提供几种通用的脚本思路和示例,你可以根据自己的技术栈(Python、Excel公式、Shell)选择。
核心思路
- 定义规则:上班时间(9:00)、下班时间(18:00)、迟到阈值、早退阈值、加班规则。
- 生成数据:使用随机数或循环生成一个月每天的打卡时间。
- 判断结果:根据规则将时间戳归类为 正常/迟到/早退/缺卡。
- 输出:导出为 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 里用公式快速生成。
- 准备日期列:A列填入日期(使用
=DATE(2024,3,ROW(A1))下拉)。 - 生成上班打卡时间:
=A2 + TIME(9, IF(RAND()<0.8, 0, RANDBETWEEN(1,30)), 0)- 公式含义:80%概率9:00整,20%概率迟到1-30分钟。
- 生成下班打卡时间:
=A2 + TIME(18, IF(RAND()<0.8, 0, RANDBETWEEN(1,30)), 0)
- 判断状态:
- 增加一列:
=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
一些高级需求
- 生成实时随机数据(用于测试):直接用 Python +
datetime.now()随机偏移。 - 配合排班系统:加入白班/夜班/倒班逻辑(修改
ON_TIME和OFF_TIME变量)。 - 生成批量员工:循环员工列表,每个员工生成独立的 Sheet。
需要注意的点
- 随机性:真实考勤不会每天都是完美的随机分布(月初、月末往往更准时),可以增加权重调整。
- 节假日:上面的代码已经跳过周末,但法定节假日(如国庆)需要额外处理(可以用
chinese_calendar库)。 - 数据隐私:生成的测试数据不要包含真实员工姓名,建议用
员工001代替。
如果你能告诉我你使用的具体工具(钉钉?Excel?数据库?)以及生成数据的用途(测试?分析?),我可以提供更精确的代码。