本文目录导读:

- 核心思路
- 方法一: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?数据库?)以及生成数据的用途(测试?分析?),我可以提供更精确的代码。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播