对应ai-data第 2.1 / 2.2 / 2.3 节(1.1 口径说明见附录) · 形态:一页步骤清单 + 校验点
用途:清洗不是「让它变干净」,是每一步都可核对。没有校验点的清洗,等于没有清洗。
一、总原则:先定口径,再动数据
口径不确认就开工,后面所有数都白做。同一份台账里的四列「金额」可能分别是含税、不含税、应收、实收——不确认就往工具里丢,它算出来的数一定对不上你的账。
开工前只做一件事:把附录的口径说明四栏填完。
二、第一步:去重与主键
先定主键,再去重
主键 = 能唯一确定一行的那几个字段。
| 数据类型 | 主键 |
|---|---|
| 单据类(订单、发票、凭证) | 单号 |
| 明细类(单据里的行) | 单号 + 行号 |
| 无单号(台账、流水) | 组合字段:日期 + 对方 + 金额 + 摘要 |
| 定不出主键 | 停止清洗,先问数据从哪来的 |
定不出主键,说明这份数据本身有问题——在沙地上盖楼,后面每一步都会返工。
去重前必做:区分「疑似重复」与「确实重复」
| 情况 | 例 | 处理 |
|---|---|---|
| 确实重复 | 同一单号、同一行号、字段全同 | 删,记录删除条数 |
| 疑似重复 | 同一客户、同一天、同金额,但单号不同 | 不要删:可能是两笔真实业务 |
| 重复但内容不同 | 同一单号,金额不同 | 不删,挑出来问来源方 |
「同一个客户同一天两笔同额收款」是真实存在的,一键去重会把它吃掉。
校验点
| 检查 | 方法 | 通过标准 |
|---|---|---|
| 主键唯一 | 主键计数是否等于行数 | 相等 |
| 去重前后差 | 记录删了几行、金额差多少 | 差值能解释(等于重复行的金额之和) |
只记「删了 12 行」不够,还要记「金额少了多少」——两者对不上,说明删错了。
三、第二步:日期与金额格式统一
为什么这一步最阴险
格式不统一时不报错。 你按月份筛,它悄悄漏了十几行,你还以为数据就这么多。
日期:五种写法必须统一成一种
| 原写法 | 问题 |
|---|---|
2026-10-01 | 标准 |
2026/10/1 | 斜杠 + 不补零 |
20261001 | 无分隔 |
2026年10月1日 | 中文 |
10/1/2026 | 月日年,与上一行冲突 |
统一为:YYYY-MM-DD(文本)或日期类型。不要用 Excel 的自定义格式假装统一——单元格里还是日期序列号,导出成 CSV 就还原成数字。
金额:四件事
| 动作 | 说明 |
|---|---|
| 去单位 | 去掉「元」「万元」——「万元」还要乘 10000,这一步最常漏 |
| 去千分位 | 1,234.56 → 1234.56 |
| 统一小数位 | 统一两位,100 → 100.00 |
| 区分正负 | 括号表示负数((100) = -100)要还原 |
还有一个隐蔽项:全角字符与空格
| 现象 | 后果 |
|---|---|
全角数字 123 | 看着一样,筛不出来、算不了 |
| 全角空格、首尾空格 | 按客户名匹配时匹配不上 |
| 不可见字符(复制粘贴带入) | 分组时多出一个「看起来一样」的组 |
处理:先去首尾空格 → 全角转半角 → 再匹配。
校验点
行数没变,才说明只是改了格式。 清洗前后各数一次行数:
| 情况 | 说明 |
|---|---|
| 行数相同 | 正常,格式统一完成 |
| 行数变少 | 有值被转成了空(如「—」被当数字处理失败),必须查 |
| 行数变多 | 有单元格内的换行被当成了新行 |
四、第三步:缺失值分三类
「删掉有空值的行」是最常见的错误处理。
| 类别 | 判断 | 处理 | 是否参与汇总 |
|---|---|---|---|
| A 该有却没有 | 业务规则上必填(如单据日期、金额) | 异常,追查来源,不自行填补 | 否(单列) |
| B 本来就没有 | 业务上可空(如备注、第二联系人) | 填默认值,必须标注 | 是(标注后) |
| C 不确定 | 无法判断该不该有 | 单独标记,不参与汇总 | 否 |
最忌讳的做法:直接填 0
0 是个真实的数,它会参与平均、参与合计,把结果悄悄拉偏。填一个 0,比留空更危险——留空你还会想起来查,填 0 看起来很正常。
做法:加标记列,不要改原值
| 列 | 内容 |
|---|---|
缺失标记 | A-缺日期 / B-无备注 / C-待确认 |
原值 | 保持为空,不要填 |
处理 | 追查 / 默认值:0 / 排除 |
保留原值 + 标记,才能在后面解释「这个数是怎么来的」。
校验点
| 检查 | 通过标准 |
|---|---|
| 缺失分布已统计 | 每列缺失行数、占比有记录 |
| 三类都有归属 | 无「未分类」的缺失 |
| 汇总口径明确 | 汇总时排除了 A 类与 C 类 |
五、三步做完的验收
| # | 检查 | 通过标准 |
|---|---|---|
| 1 | 主键唯一 | 主键计数 = 行数 |
| 2 | 去重差可解释 | 行数差与金额差能对上 |
| 3 | 日期单一格式 | 按月筛选的行数 = 该月应有行数 |
| 4 | 金额为数值型 | 求和不为 0、不报错 |
| 5 | 无全角/空格残留 | 客户名去重后的组数 = 实际客户数 |
| 6 | 缺失三类已分类 | 无未分类项 |
| 7 | 原值保留 | 有标记列,原值未被覆盖 |
七项全过,再进 02-核对模板.md。跳过任何一项,后面的核对都会变成「核对一个错的数」。
六、常见误用
| 误用 | 后果 |
|---|---|
| 不主键就去重 | 删掉真实业务行,金额对不上且找不到原因 |
| 一键去重 | 同上,且无删除记录,无法恢复 |
| 用自定义格式假装统一日期 | 导出后还原成序列号 |
| 漏掉「万元」换算 | 金额差 10000 倍 |
| 缺失值填 0 | 结果悄悄偏小,且看起来正常 |
| 删除有空值的行 | 样本偏差,汇总全部失真 |
| 清洗后不数行数 | 丢行无人发现 |
附录|口径说明模板(第 1.1 节)
四栏
| 栏 | 填什么 | 例 |
|---|---|---|
| 字段含义 | 这一列到底是什么 | 「金额」= 含税应收金额(元),不含实收 |
| 统计周期 | 按什么时间口径归集 | 自然月(1 日–月末),非开票月 |
| 排除项 | 哪些记录不算 | 作废单、测试单、内部往来、跨期调整 |
| 口径版本 | 版本号与生效期 | v2,自 2026-10 期起生效 |
为什么第四栏必须有
三个月后有人问「为什么这两个月的数对不上」,这张纸就是答案。没有版本,你只能重新推一遍,还推不出来。
变更记录
| 版本 | 生效期 | 改了什么 | 为什么改 |
|---|---|---|---|
| v1 | 2026-01 | 初版 | —— |
| v2 | 2026-10 | 「金额」由不含税改为含税 | 与客户对账口径统一 |
两个常见口径差异(提前说清,能省掉一半争议)
| 差异 | 表现 | 影响 |
|---|---|---|
| 含税 / 不含税 | 合计差 6% 或 13% | 与客户对账必然对不上 |
| 自然月 / 开票月 | 月末几天的单归属不同 | 两个月的数据都「错」,但合计正确 |
判断方法:两个数差一个税率 → 含税口径;只有月末几天不一致 → 期间口径。