SAS时间格式:转化技巧与注意
日期格式,是任何语言绕不开的易错重点,SAS亦如是。在SAS中,本质上的数据类型只有两种:数字,文本;非此即彼。时间本质上也是数字。但是,日常数据集使用中, 日期格式 ,往往有 3种 表示方式: 数字 (如:20210803,字面意思,纯数字), 字符串 (对应为:'20210803'), 日期 (对应为:'3Aug2021'd,SAS中存储为从1960-1-1开始算起的天数)。
1、先谈基础理论
SAS 日期值,date:代表从1960年1月1日开始,到指定日期之间的天数。1960年1月1日之前的日期为负数,在此之后的日期为正数;
SAS 时间值,time:代表自当日午夜12时算起的秒数,SAS 时间值介于 0 和 86400 之间,以秒数计;
SAS 日期时间值,datetime:是代表从1960年1月1日0时0分0秒开始,到指定日期小时/分钟/秒之间的秒数的值。注意,SAS中datetime与date的差异,不像excel那样,date+time=整数+小数的方式,而是计算方式的根本性不同。
2、日常中,如何互相转化
以一个最常见的小场景为例 :假设有数值型的20120305,想要表示意义为2012年3月5号,但是在SAS中同样的日期的数值型应该表示为19057之类的数值。
也就是说,如何把数值型的日期20120305,转换成SAS内部的、与2012年3月5号相对应的数值型日期(如19057),以用于以后的日期函数操作?即,将原始的11.的数值型,形如20120304,变为日期型,如yymmdd10.的2012-03-04。
问题非常经典,我能想到的解决方法有两个:
① 先把数值型的20120305转换为字符型,再用substr+mdy函数,得到日期新变量
② 使用整除+mdy函数
其中,这里使用到两个函数:
int(x): 返回x的整数部分
mod(x,y):x除以y后,取余数部分
这里,思路的关键是:
例如数据为:20010305,
年:除以10000,取整数部分
月:先除以100,取整数部分;然后再除以100,取余数部分。
日:除以100,取余数部分
3、扩展开来:数字和文本互相转化的注意点
众所周知,数据类型转换函数:input(),put()。
put()函数 :把数值型或字符型变量转为文本型变量
input()函数 :将字符型变量转化为数值型变量
但是要注意:
① 这里的数据类型转换,只是针对 新变量 !如果变量已经出现过,例如想将已有的文本类型a转化为数值类型,则会失败。
得到的结果:
② 数据类型,互相转化的方法
数字->文本:使用put函数
文本->数字:使用算数运算法,+0或者-0都可以
每一个小点,都值得被认真对待!