浏览 AI使用教程
Excel 日期格式怎么批量统一:保留原值并标记异常
Excel 日期看起来统一,不代表底层值真的一致。保留原列,分别识别文本、序列号和模糊日期,再把无法确定的行留给人工判断。
按实际操作顺序推进
每完成一段就检查当前输出,确认结果符合预期后再继续。
日期全变成同一种格式后,日和月可能已经被调换
一份报名表的日期列同时出现 `2026/9/3`、`03-09-2026`、Excel 序列号和“9 月上旬”。直接统一格式后,屏幕上都像日期,但其中两行已经把日月调换。
- 原值列仍完整保留
- 按年、月、日抽样后与来源记录一致
- 异常值没有被自动补成某一天
动手前,把材料和不能改的部分定下来
| 需要确认 | 本例内容 |
|---|---|
| 现有材料 | 12行教学数据,原列保留;日期为2026年,数字序列值已确认来自Excel1900日期系统。03-09-2026与04-05-2026的来源地区未知,不能猜。下面M代码自带完整输入,可在Microsoft365桌面Excel的Power Query空白查询中练习。 |
| 不能越过的边界 | 只有能唯一解释的值才转换;模糊文本和日月顺序不明的值进入异常表,不以当前电脑区域设置猜测。 |
| 要交付的结果 | 原值列、规范值列和错误清单 |
Excel 日期格式批量统一,从“保留原值和日期系统”开始做
保留原值和日期系统
复制原文件并新增规范日期/状态列;数字序列值先确认1900或1904系统。
列出日期模式
分年在前、地区已知、地区未知、序列值、模糊描述与空值;不把显示格式当真实类型。
只转换能确定的值
按下方完整教学查询练习;地区已确认才加Format/Culture规则,未确认行保留null及原因。
逐行回看
检查12行仍在,1—8行顺序正确,9—11异常,12空值;真实数据按每种模式抽查。
另存并记录规则
加载到新表,不覆盖原列。补证据后记录哪条规则和哪些行发生变化。
空白查询只运行教学副本
在Excel打开一个新空白工作簿,通过“数据→获取数据→从其他源→空白查询”进入Power Query,在高级编辑器替换为下方代码。此查询自带12行教学值,不读取你的原始文件。
代码只自动解释年在前的明确格式以及已确认日期系统的序列值。要迁移到真实文件,先替换Source并复核字段类型/日期系统,不能盲用本例序列起点。
12行日期与完整M查询
12行日期与完整M查询
let
Source = #table(type table [行号 = Int64.Type, 原值 = any], {
{1,"2026-09-01"}, {2,"2026/9/2"}, {3,"2026-09-03"}, {4,"2026/09/04"},
{5,46270}, {6,46271}, {7,"2026-09-07"}, {8,"2026/9/8"},
{9,"03-09-2026"}, {10,"04-05-2026"}, {11,"9 月上旬"}, {12,null}
}),
Parse = (v as any) as record =>
if v = null then [规范日期=null, 状态="空值"]
else if Value.Is(v, type number) then
if v = Number.RoundDown(v) and v >= 46023 and v <= 46387
then [规范日期=Date.AddDays(#date(1899,12,30),v), 状态="已转换:已确认1900日期系统"]
else [规范日期=null, 状态="序列值不在本例范围"]
else
let
t=Text.Trim(Text.From(v)),
parts=Text.Split(Text.Replace(t,"/","-"),"-"),
isYearFirst=List.Count(parts)=3 and Text.Length(parts{0})=4,
attempt=try (if isYearFirst then #date(
Number.FromText(parts{0},"en-US"),
Number.FromText(parts{1},"en-US"),
Number.FromText(parts{2},"en-US")) else error "非确定年月日")
in
if t="" then [规范日期=null,状态="空值"]
else if not attempt[HasError] then [规范日期=attempt[Value],状态="已转换:年在前"]
else if Text.Contains(t,"上旬") then [规范日期=null,状态="非精确日期"]
else [规范日期=null,状态="格式或地区待确认"],
Added=Table.AddColumn(Source,"解析",each Parse([原值])),
Expanded=Table.ExpandRecordColumn(Added,"解析",{"规范日期","状态"}),
Typed=Table.TransformColumnTypes(Expanded,{{"规范日期",type date}})
in
Typed未在本机运行Excel;按表逐行核对预期结果。代码保留空值及异常,结果列明确为date。
同一12行输入与预期结果
| 行 | 原值 | 预期规范日期/状态 |
|---|---|---|
| 1 | 2026-09-01 | 2026-09-01 |
| 2 | 2026/9/2 | 2026-09-02 |
| 3 | 2026-09-03 | 2026-09-03 |
| 4 | 2026/09/04 | 2026-09-04 |
| 5 | 46270,已确认1900系统 | 2026-09-05 |
| 6 | 46271,已确认1900系统 | 2026-09-06 |
| 7 | 2026-09-07 | 2026-09-07 |
| 8 | 2026/9/8 | 2026-09-08 |
| 9 | 03-09-2026 | null;格式或地区待确认 |
| 10 | 04-05-2026 | null;格式或地区待确认 |
| 11 | 9 月上旬 | null;非精确日期 |
| 12 | null | null;空值 |
地区得到确认后再新增规则
例如业务负责人确认第9行确为英国日-月-年,可针对这类已确认来源使用Date.FromText("03-09-2026", [Format="dd-MM-yyyy", Culture="en-GB"]),预期为2026-09-03;仍不确定的第10行继续保留未知。
关闭并加载到新工作表后,核对12行、8个明确日期、3个异常及1个空值。排序只能帮助发现异常,显示格式统一不能证明底层日期正确。
完成后的原值列、规范值列和错误清单
教学预期为12行保留:1—8行依次转换为2026-09-01至09-08;第9、10行格式/地区待确认,第11行非精确日期,第12行保持空值。规范日期与状态为新增列,不覆盖原值。本页未运行本地Excel。
为什么“排序后日期顺序仍然异常”还不能交付
排序后日期顺序仍然异常
- 原因
- 部分单元格只是长得像日期的文本
- 怎么改
- 用 `ISTEXT`、序列值和最小/最大日期联合检查,并回到来源地区确认
