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函数,得到日期新变量

先用put()函数转化为文本,然后使用mdy()函数
date:数字,date_1:文本,date_2:日期

② 使用整除+mdy函数

使用整除函数mod&int+mdy()函数
date:数字,date_1:日期

其中,这里使用到两个函数:

int(x): 返回x的整数部分
mod(x,y):x除以y后,取余数部分

这里,思路的关键是:

例如数据为:20010305,
年:除以10000,取整数部分
月:先除以100,取整数部分;然后再除以100,取余数部分。
日:除以100,取余数部分

3、扩展开来:数字和文本互相转化的注意点

众所周知,数据类型转换函数:input(),put()。

put()函数 :把数值型或字符型变量转为文本型变量
input()函数 :将字符型变量转化为数值型变量

但是要注意:

① 这里的数据类型转换,只是针对 新变量 !如果变量已经出现过,例如想将已有的文本类型a转化为数值类型,则会失败。

举个例子:使用input函数,试图将文本转为数值

得到的结果:

b-转换成功,c-转换失败

② 数据类型,互相转化的方法

数字->文本:使用put函数
文本->数字:使用算数运算法,+0或者-0都可以
最后举个例子,数值/文本的转化
得到结果如上

每一个小点,都值得被认真对待!

编辑于 2021-09-16 23:12