本篇介绍sas中表达式、常量、变量的概念以及常用的函数。


SAS表达式是由一系列算符和运算对象形成的一个指令集,它被执行后产生一个目标值。 运算对象是SAS变量和SAS常数;算符是特殊的运算符、函数和括号。

日期时间变量在时间序列分析中有较为重要的地位,掌握时间日期变量的转换是格外重要的!!!
话不多说,开始吧!

时间数据简要介绍

众所周知,时间序列数据在SAS中的存储方式是将时间转换成距离1960年1月1日的天数, 例如:

1960年1月3日,在系统中存为2。

2004年1月25日,在系统中存为16095。

1959年12月30日,在系统中存为-2。

如下图所示:

grafana 时间变量 什么是时间变量_SAS


SAS官方也给了关于时间序列的解释图,

grafana 时间变量 什么是时间变量_SAS_02


我们要明白,时间序列之间是可以相加减的,其本质就是其在内存中存储的天数相加减,如图:

data test;   
   date1=22095;
   format Date1 date9.;
   date2=22122;
   format Date2 date9.;
   gap = date1-date2;
   date3 = date1+10;
run;
proc print data=test;
run;

grafana 时间变量 什么是时间变量_数据_03


上图中值得注意的是,使用时间数据减去某一常数时,返回结果会以差值天数展示

形似时间数据转化为时间数据

在录入数据时,我们常常遇到的数据类型往往是这样

grafana 时间变量 什么是时间变量_数据_04


当整列的数据出现在数据中时,有效的将其转化为时间数据就需要一些办法。

下面以此段数据为例

grafana 时间变量 什么是时间变量_grafana 时间变量_05


此段数据形式为,数据录入时代码如下。

data schedule;
   input projdate mmddyy10.;
format projdate mmddyy10.;
datalines;
01/15/25
03/15/2025
01/30/96
02/05/12
06/15/2012
;
proc print data=schedule;
run;

grafana 时间变量 什么是时间变量_数据_06

值得注意的是,代码中出现了两次mmddyy10,分别删去两次mmddyy10后运行

去除第一个:

grafana 时间变量 什么是时间变量_SAS_07


去除第二个:

grafana 时间变量 什么是时间变量_数据_08


可见两次代码的作用如下:

第一次:提示input语句此列数据作为相应格式的时间数据保存在数据集中,即输出结果为与零时间对应的差值

第二次:将差值转化为相对应格式的数据并保存在数据集中

利用函数将年月日转化为时间数据

在录入数据时,有时候并不能将年月日数据合并到一个变量中,往往存在不同的变量分别保存年、月、日等数据,此时便需要mdy函数,mdy函数官方文档 代码如下

data aaa;
date1 = mdy(5,18,1998);
format date1 mmddyy10.;
run ;
proc print data = aaa;
run;

grafana 时间变量 什么是时间变量_SAS_09

非时间数据转化为时间数据

差值天数转化为时间数据

经过上面的示例可以看到可以将距离零时间的天数转化成日期变量

data test;
input date;
format date date9.; 
cards;
22
;
proc print data=test;
run;

grafana 时间变量 什么是时间变量_grafana 时间变量_10


其中format语句是至关重要的一部分,其后可以搭配诸多选项,可查阅SAS官方关于日期变量的文件

grafana 时间变量 什么是时间变量_时间序列_11

非差值天数转化为时间数据

上述内容展示了利用与零时间的差值,将数据转化为时间数据。同样,在已知一个时间的前提下,得到目标时间点与已知时间点的天数也能得到目标时间的时间数据格式

data test;   
   date1=22095;
   format Date1 date9.;
   gap = 10;
   date2 = date1+gap;
   format date2 date9.;
run;
proc print data=test;
run;

grafana 时间变量 什么是时间变量_grafana 时间变量_12

关于非时间数据转化为时间数据的小结

非时间数据转化为时间数据的本质是:在给定某一整数的前提下,将此整数视为与零时间的差值,从而根据日历计算目标时间。
转化此类数据最关键的方法是使用format语句对给定整数进行转化
即上述代码中的

format Date1 date9.;

同样的,此代码最后一段具有多种可替换的格式,具体请查看可查阅SAS官方关于日期变量的文件

结语

sas存储时间数据的逻辑比较单一,仅为将数据存储为与零时间的差值。其他所有关于时间数据的转换皆为对此差值的操作。
这一篇笔记就这样了,感谢你能看到这里,我会继续更新的!