You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单列多格式日期的SAS标准化处理:转换为MMDDYY格式求助

SAS 混乱日期格式标准化解决方案

针对你遇到的多种混乱日期格式统一问题,以下是可以覆盖所有场景的SAS代码,能将不同格式转换为MM/DD/YYYY的标准日期:

data want;
    set have;
    length cleaned_date 8;
    format cleaned_date mmddyy10.;
    
    /* 处理带星期的日期(如Sunday, December 25, 2011) */
    if index(date, ',') then do;
        /* 截取逗号后的日期部分,跳过星期字符串 */
        date_part = substr(date, index(date, ',') + 2);
        cleaned_date = input(date_part, date9.);
    end;
    /* 处理带多余时间后缀的斜杠日期(如4/23/200500:00) */
    else if index(date, '/') then do;
        /* 定位第二个斜杠,截取到完整年份部分,截断多余的00:00 */
        second_slash_pos = index(date, '/', index(date, '/') + 1);
        date_part = substr(date, 1, second_slash_pos + 4);
        cleaned_date = input(date_part, mmddyy10.);
    end;
    /* 处理Excel日期序列号(如38236.58333336) */
    else if not anyalpha(date) then do;
        /* 转换Excel基准日到SAS基准日,保留整数日期部分 */
        cleaned_date = int(input(date, best12.) + '30DEC1899'd);
    end;
run;

各场景处理说明

  1. 带星期的日期:通过index定位第一个逗号,截取后续的December 25, 2011部分,用date9.格式直接读取(该格式支持月份全称+日+年的组合)。
  2. 带多余时间的斜杠日期:找到第二个斜杠的位置,只保留到年份的4位数字(如从4/23/200500:00中提取4/23/2005),再用mmddyy10.格式解析。
  3. Excel日期序列号:Excel以1900年1月1日为日期起始点,SAS以1960年1月1日为基准,因此需要加上'30DEC1899'd完成转换,用int()去掉小数对应的时间部分,只保留纯日期。

你之前代码的问题解析

  • 第一段代码中,给斜杠日期追加/2020会破坏原有年份信息(比如4/5/2006会变成无效的4/5/2006/2020),且未处理带星期的格式。
  • 第二段代码错误地使用put函数:date是字符型变量,put用于将数值转成字符,而你需要的是用input将字符转成数值型日期;同时mmddyy10.是数值格式,不能直接用于字符变量,导致SAS自动查找不存在的字符格式$mmddyy10并报错。

转换结果验证

原始日期标准化日期
Sunday, December 25, 201112/25/2011
38236.5833333609/06/2004
4/23/200500:0004/23/2005
4/5/200604/05/2006

内容的提问来源于stack exchange,提问作者ACC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:11:24