求助:将字符型日期转换为SAS指定格式mmyyn6.
解决SAS日期格式转换问题(M/D/YY转032020)
问题分析
你的原始数据中DATE是字符型的M/D/YY格式,需要转换为mmyyn6.样式的6位数字(如032020)。之前的方法失败原因如下:
- 直接用
mmyyn6.informat读取带日的日期字符串:mmyyn6.仅支持无日的年月格式(如032020),无法解析带日的M/D/YY,导致缺失值。 - 用
ANYDTDTM.转成datetime值后套用日期格式:ANYDTDTM.生成的是datetime类型(以秒为单位的时间戳),而mmyyn6.是日期格式,两者基数不同,无法正确转换。 - 使用
DTMONYY7.格式:该格式是datetime类型的文本格式,输出为Mar2020样式,不符合纯数字的需求。
可行解决方案
核心思路:先将字符型日期转换为SAS标准日期值,再通过格式输出目标样式。
方法1:DATA步实现
DATA WANT; SET HAVE; /* 将字符型M/D/YY转换为SAS日期值 */ sas_date = INPUT(DATE, MMDDYY8.); /* 转换为032020样式的字符型结果 */ month_year = PUT(sas_date, MMYYN6.); /* 若需要数值型结果,可添加以下语句 */ /* month_year_num = INPUT(month_year, 6.); */ DROP sas_date; /* 移除中间变量 */ RUN;
方法2:PROC SQL实现
PROC SQL; CREATE TABLE WANT AS SELECT GROUP, DATE, COUNT_CUMU, /* 一步完成转换:转日期值→转目标格式 */ PUT(INPUT(DATE, MMDDYY8.), MMYYN6.) AS month_year /* 如需数值型,改为:INPUT(PUT(INPUT(DATE, MMDDYY8.), MMYYN6.), 6.) AS month_year_num */ FROM HAVE; QUIT;
说明
MMDDYY8.informat专门用于解析M/D/YY或MM/DD/YYYY格式的字符日期,能正确识别你的原始数据。MMYYN6.格式会将SAS日期值转换为6位数字的年月格式(两位月份+四位年份),正好匹配你需要的032020样式。- 如果需要数值类型的结果,可通过
INPUT()函数将字符型的month_year转换为数值。
内容的提问来源于stack exchange,提问作者Quinterpret
相关产品推荐
相关产品推荐

