单列多格式日期的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;
各场景处理说明
- 带星期的日期:通过
index定位第一个逗号,截取后续的December 25, 2011部分,用date9.格式直接读取(该格式支持月份全称+日+年的组合)。 - 带多余时间的斜杠日期:找到第二个斜杠的位置,只保留到年份的4位数字(如从
4/23/200500:00中提取4/23/2005),再用mmddyy10.格式解析。 - 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, 2011 | 12/25/2011 |
| 38236.58333336 | 09/06/2004 |
| 4/23/200500:00 | 04/23/2005 |
| 4/5/2006 | 04/05/2006 |
内容的提问来源于stack exchange,提问作者ACC
相关产品推荐
相关产品推荐

