如何解决SAS数据集复制日期变量后变为数值型18505的问题
解决SAS日期变量赋值后显示为数值的问题
这是SAS里非常常见的日期处理小场景,别慌!咱们先搞清楚背后的原因,再给你两种实用的解决办法:
为什么会变成18505?
SAS的日期变量底层本质是数值——它存储的是从1960年1月1日(SAS的基准日期)到目标日期的天数。你看到的31AUG2010其实是SAS给这个数值套了日期格式后的显示效果,而它的底层数值就是18505。
你执行newdate=date;的时候,只是把date变量的底层数值复制给了newdate,但没有把原变量的日期格式一起复制过去,所以SAS就直接显示了原始的数值。
解决方法
方法1:给newdate添加日期格式(推荐,保留日期变量属性)
如果还是想让newdate作为日期变量使用(方便后续日期计算),只需要给它加上日期格式即可,这样显示时就会变回你熟悉的日期样式:
data b; set a; newdate = date; format newdate date9.; /* date9.格式会输出DDMMMYYYY样式,比如31AUG2010 */ run;
你也可以根据需求换其他格式,比如mmddyy10.会显示为08/31/2010,ddmmyy10.显示为31/08/2010,选适合你的就行。
方法2:转换为字符型日期(如果需要文本格式)
如果你不需要日期变量的计算能力,只想得到31AUG2010这样的文本字符串,可以用PUT函数把数值日期转换成字符型:
data b; set a; newdate_char = put(date, date9.); /* 生成字符型变量,值为"31AUG2010" */ run;
注意这里生成的newdate_char是字符类型,不能直接做日期加减这类操作,适合只需要展示的场景。
内容的提问来源于stack exchange,提问作者user1481397
相关产品推荐
相关产品推荐

