浏览 AI使用教程

Excel 日期格式怎么批量统一:保留原值并标记异常

Excel 日期看起来统一,不代表底层值真的一致。保留原列,分别识别文本、序列号和模糊日期,再把无法确定的行留给人工判断。

按实际操作顺序推进

每完成一段就检查当前输出,确认结果符合预期后再继续。

  1. 01准备动手前,把材料和不能改的部分定下来
  2. 02执行12行日期与完整M查询
  3. 03检查为什么“排序后日期顺序仍然异常”还不能交付
  4. 04完成原值列、规范值列和错误清单通过哪些检查才算完成
从手头这一份材料开始

日期全变成同一种格式后,日和月可能已经被调换

一份报名表的日期列同时出现 `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行输入与预期结果

行原值预期规范日期/状态
12026-09-012026-09-01
22026/9/22026-09-02
32026-09-032026-09-03
42026/09/042026-09-04
546270,已确认1900系统2026-09-05
646271,已确认1900系统2026-09-06
72026-09-072026-09-07
82026/9/82026-09-08
903-09-2026null;格式或地区待确认
1004-05-2026null;格式或地区待确认
119 月上旬null;非精确日期
12nullnull;空值
怎样处理

地区得到确认后再新增规则

例如业务负责人确认第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`、序列值和最小/最大日期联合检查,并回到来源地区确认
验收方式

原值列、规范值列和错误清单通过哪些检查才算完成

依据与范围

本页实际使用的资料