45周 考勤整理专题 -1
优秀创作者
45-1 考勤日期标准化 - 题目
📌 知识点总结:考勤日期标准化处理
在处理打卡时间记录时,为实现高效的数据整理与分析,需先对原始数据中的日期信息进行标准化处理。以下是关键操作思路与技术要点:
✅ 1. 统一日期格式是考勤数据处理的基础
原始打卡记录中常以文本形式存储日期(如“10-01”、“10-31”),无法直接参与计算。必须将其转换为标准的 Excel 日期格式,以便后续统计、筛选和计算。
✅ 2. 从标题栏提取关键时间信息
打卡时间记录工作表中的单元格 B2 包含重要时间信息:
text编辑
统计时间:10-01 ~ 10-31 制表时间:2025-11-01 08:51(UTC+8)其中:
“10-01” 表示起始日(10月1日)
“10-31” 表示结束日(10月31日)
“2025” 是年份信息
可通过以下方式提取:
使用 MID() 提取月份(第6~7位):MID(B2,6,2) → "10"
使用 REGEXP() 或 TEXTSPLIT() 提取年份(从“制表时间”部分):REGEXP(B2,"\d{4}") → "2025"
✅ 3. 构建连续日期序列
根据统计周期(本例为10月1日至10月31日),生成完整的日期序列:
=SEQUENCE(COLUMNS(C4:.ZZ4), , DATE(2025, @REGEXP(B2, "\d+"), 1))=TOCOL(DATE(MID(B2,29,4), MID(B2,6,2), REGEXP(C4:AG4, "[0-9]+")))COLUMNS(C4:.ZZ4) 自动判断列宽(共31列),对应31天
DATE(年, 月, 日) 构造具体日期
REGEXP(C4:AG4, "[0-9]+") 提取每列中数字部分作为“日”
✅ 4. 文本转日期的多种方法对比
可采用多种方式将文本型日期转换为标准日期:
方法 | 公式示例 | 特点 |
文本拼接 + TEXT | TEXT(2025&"/"&MID(B2,6,2)&"/"&TEXTSPLIT(C4:.ZZ4,CHAR(10)),"YYYY/MM/DD") | 需结合 TEXTSPLIT 分割换行符 |
直接构造 DATE 函数 | DATE(年, 月, 日) | 最稳定、推荐使用 |
✅ 5. 动态适配不同月份长度
由于每月天数不同(如2月28/29天、10月31天等),应基于实际列数动态生成日期序列:
利用 COLUMNS(C4:.ZZ4) 动态获取日期范围宽度
避免硬编码天数,提高通用性
🧩 实际应用建议
在“日期”工作表的 A2 单元格输入公式,自动生成 2025 年 10 月 1 日 至 31 日 的完整日期序列。
所有公式均依赖于 打卡时间记录!B2 中的时间信息,确保其不被修改。
推荐使用 DATE + REGEXP + TOCOL 组合方案,兼顾准确性与兼容性。
🎯 总结口诀
拼接转标准,减负成实数;
动态定宽度,通用才可靠。”
此方法适用于各类打卡系统导出的非结构化时间数据,具有良好的扩展性和自动化能力,是考勤数据分析的重要前置步骤。
45-2 按日期天数重复姓名 - 题目
📌 知识点总结:二维打卡数据 → 一维结构化转换(横向扩展为纵向重复)
在处理考勤类表格时,原始数据常以“人员 × 日期”的二维形式呈现。为了便于后续统计分析(如按天汇总、计算迟到早退、生成报表等),需将该二维表转化为一维长表结构,即每个员工每天的数据单独成行。
以下公式展示了多种实现方式,并提炼出核心思路与技巧。
✅ 1. 核心思想:按列重复展开 —— “重复次数”是关键
将二维表转换为一维表的本质是:
例如:
员工“刘备”有31天打卡记录 → 其序号和姓名需要重复31次
每次重复对应一天的打卡数据
因此,“重复次数” = COLUMNS(C4:AG4),即日期列的数量(本例中为31列)。
✅ 2. 方法一:使用 REPTARRAY + SORT 实现快速展开
A2 = SORT(REPTARRAY(打卡时间记录!A5:.B500, COLUMNS(打卡时间记录!C4:.AG500)))REPTARRAY(区域, 次数):将 A5:B500 区域中的每一行重复指定次数(这里是31次)
SORT():用于去除可能因数组顺序导致的乱序问题,确保输出有序
✅ 优点:
语法简洁,直观易懂
自动完成行列展开,无需复杂嵌套
⚠️ 注意:
要求 REPTARRAY 是可用函数(WPS/Excel 365 支持)
若不支持,可用其他方法替代
✅ 3. 方法二:分列判断 + TOCOL + HSTACK(逐列提取)
A2 = LET(a, 打卡时间记录!C5:.AG500,
HSTACK(
TOCOL(IF(a > 0, 打卡时间记录!A5:.A500)),
TOCOL(IF(a > 0, 打卡时间记录!B5:.B500))
))a > 0:判断是否有打卡记录(非空且数值大于0)
IF(a > 0, 序号):仅当有打卡时才返回序号,否则为空
TOCOL(...):将每列结果转为一维列向量
HSTACK(...):合并两个列向量为一个两列表
✅ 优点:
不依赖特殊函数,兼容性好
可灵活控制是否包含“没上班”状态
❌ 缺点:
需要分别处理“序号”和“姓名”列
处理多列数据时需多次调用 TOCOL,效率较低
无法直接处理“没上班”文本(需额外判断)
✅ 4. 方法三:利用 REDUCE + VSTACK 迭代构建(动态堆叠)
A2 = LET(序号姓名, 打卡时间记录!A5:.B500,
序号, TAKE(序号姓名,,1),
次数, COUNTA(打卡时间记录!C4:AG4),
LET(brr, REDUCE("", 序号,
LAMBDA(X,Y,
VSTACK(X,
REPTARRAY(INDEX(序号姓名,Y,{1,2}), 次数)
)
)),
DROP(brr,1)))使用 REDUCE 对每一行员工进行迭代处理
REPTARRAY(INDEX(...), 次数):提取当前行并重复指定次数
VSTACK 将各行结果垂直堆叠
最后 DROP(brr,1) 去除首行空值
✅ 优点:
完全基于标准函数,兼容性强
可扩展性强,适合复杂逻辑
易于调试和理解流程
✅ 5. 方法四:使用 MAKEARRAY 构造索引矩阵(数学建模法)
A2 = LET(序号姓名, 打卡时间记录!A5:.B500,
序号行数, ROWS(TAKE(序号姓名,,1)),
次数, COUNTA(打卡时间记录!C4:AG4),
总重复行数, 序号行数 * 次数,
MAKEARRAY(总重复行数, 2,
LAMBDA(行, 列,
LET(序号行, CEILING(行 / 次数, 1),
INDEX(序号姓名, 序号行, 列)
)
)
))MAKEARRAY(n,m,...):创建 n×m 的数组
CEILING(行 / 次数, 1):确定当前行属于第几个原始员工
INDEX(...):从原表中取对应值
✅ 优点:
数学模型清晰,性能稳定
无循环结构,适合大数据集
可轻松扩展至更多字段
✅ 6. 方法五:结合 SEQUENCE 与 IF 实现条件重复
A2 = LET(序号姓名, 打卡时间记录!A5:.B500,
序号, TAKE(序号姓名,,1),
次数, COUNTA(打卡时间记录!C4:AG4),
LET(brr, REDUCE("", 序号,
LAMBDA(X,Y,
LET(当前行, INDEX(序号姓名,Y,{1,2}),
VSTACK(X,
IF(SEQUENCE(次数), 当前行)
)
)
)),
DROP(brr,1)))SEQUENCE(次数) 生成 1~31 的序列
IF(..., 当前行):将当前行重复31次
通过 REDUCE 逐行累加
✅ 优点:
控制粒度细,可加入条件判断(如只保留有效打卡)
易于扩展到带条件的重复逻辑
🔧 核心知识点提炼
编号 | 知识点 | 说明 |
1 | 重复次数 = 列宽 | COLUMNS(C4:AG4) 是决定重复次数的关键参数 |
2 | 二维转一维的核心是“重复” | 每个员工的信息需重复“天数”次 |
3 | ROWS, COLUMNS, SEQUENCE 是基础 | 用于生成索引数组,支撑 INDEX 或 MAKEARRAY |
4 | REPTARRAY 是高效神器 | 直接实现“重复展开”,简化代码 |
5 | REDUCE + VSTACK 是迭代利器 | 适用于无法使用 REPTARRAY 的环境 |
6 | MAKEARRAY 是数学建模首选 | 通过索引映射构建新表,性能最优 |
7 | TOCOL + HSTACK 适合分列处理 | 但需注意单列处理的局限性 |
🎯 实际应用建议
优先推荐使用 REPTARRAY 方法(若支持)
简洁高效,适合日常使用。
若需兼容旧版 Excel 或 WPS,推荐使用 MAKEARRAY 或 REDUCE 方法
更稳定、可控。
预留足够行数裁剪范围(如1000行)
防止数据溢出或公式失效。
约束条件明确:
✅ 按日期重复对应数据
✅ 保持序号与姓名一致
✅ 预留足够空间(建议 ≥1000行)
🧩 示例效果说明
共 6 名员工 × 31 天 = 186 行数据,形成可用于后续分析的一维长表。
📚 小结口诀
一行变多靠展开;
REPTARRAY最省事,
MAKEARRAY更精准;
二维变一维,
数据才好算!”
此系列操作是数据清洗与结构化处理的重要环节,广泛应用于人事考勤、销售日报、项目进度跟踪等领域。掌握这些技巧,能大幅提升工作效率与数据分析能力。