在编程过程中,日期、时间的处理是很常见的,SAS中也有很多日期处理相关的语法或函数,那么今天就与小编一起来看看,针对日期、时间的哪些编程的语句....
一句话,几个函数
以前在人大经济论坛上一个很经典的帖子...奥,记得不是很清楚了,大致就是输入一个日期...然后噼里啪啦出一大串结果...那么接下来就来还原一下,那个帖子是如何经典的...
代码语言:javascript复制options nosource nosource2 nonotes;
data _NUll_;
skip 5;
format c7 yymmdd10.;
bdat='15Jun1993'd;
c1=year(bdat);c2=qtr(bdat);c3=month(bdat);c4=week(bdat);c5=weekday(bdat)-1;
c6=day(bdat);c7=today();c8=intck('year',bdat,c7);c9=intck('day',bdat,c7);c10=365*100-c9;
c11=intck('day','01JAN1900'd,bdat);
Putlog '我出生在' c1 '年的第' c2 '个季度,也是一年中的第' c3 '个月,也是一年中的第' c4 '周的一个周' c5 ' ;';
Putlog '这一天是这个月的第' c6 '天';
Putlog '今天是 : ' c7 ',我来到这世界已经' c8 '年了' ;
Putlog '准确的来说我已经活了' c9 '天' ;
Putlog '如果我能活100岁,那么我还能活' c10 '天' ;
Putlog '我比SAS日期的生日(SAS日期开始计算的时间"1960-01-01T00:00")晚了' bdat '天';
Putlog '我比Excel日期的生日(Excel日期开始计算的时间"1900-01-01T00:00")晚了' C11 '天';
skip 5;
run;
看到上面那段代码....你能猜出日志会是什么效果吗?不妨猜的看看,这里面用了好一些函数...都是与日期相关的...这也是日期相关的函数的冰山一角....但是不妨认为是很经典的一段话......接下来看看Log的效果
看完日志,我突然我现在...我的生命只剩下了3/4了...1/4的生命就这样过去了....
那么时间都去哪儿了...
一些说明
SAS里面日期、时间的本质是什么?是一个数字,只是给这个数字披上一层外衣(format),是从1960年1月1日开始算的,如果给0加上日期的format(yymmdd10.),那么就表示1960-01-01...关于日期相关的函数和介绍,看啥都没有看SASHELP齐全...很多也不用特意记得,记几个常用的,冷门的SASHELP里面搜一下,一下子就出来了....
有很长很长....所以也就不全截图下来了,怎么看SASHELP,红色圈圈起来的...
小编英文不好,从来不看那一堆乱七八糟的英文描述,每次都直奔代码和而去...所以也就造成了技术还是不太好的结果...如果有兴趣,建议还是读看看
Excel导入SAS
看这个标题,为啥还要单独说一下Excel导入SAS需要注意的问题呢?前文提到了SAS日期的生日(1960-01-01),那么Excel里面的日期的也有生日么?是的,有的1900-01-01是Excel里面日期的生日;他们的本质其实都是一个数值,不知道你们在将excel导入SAS的时候,有没有遇到Excel里面的日期导入到SAS就变成了一个3-4W的数字..反正我是遇到过的...那么接下来就看看这种情况如何解决..
代码语言:javascript复制proc import out=dsn
datafile= "&path."
dbms=excel replace;
range="&sheet.$";
getnames=yes;
scantext=yes;
usedate=yes;
scantime=yes;
run;
现在想造一下,这样数据,发现特意造不出来....所以就不举例子了,遇到这样的情况可以加一个usedate=yes;的选项,大概可能解决这样的问题。。。
这篇的缘由
那么今天,还要说一下写这一篇的由来,为啥要写日期的处理呢,大概是前几天有个留言问小编,excel里面有Networkday函数计算俩个日期间的工作日,那么SAS里面有这样的函数么?想来香去,好像是没有...
没有怎么办!没有就自己造咯...造了不就有了...接下来就来看看SAS自定义函数的一个简单小例子...
代码语言:javascript复制proc fcmp outlib=sasuser.fun.workdate;
function workdate(var1 ,var2 ) ;
gg=0;
st=var1;
en=var2;
do x=st to en;
wk=weekday(x);
if wk in (2 3 4 5 6) then fg=1;
else fg=0;
gg fg;
end;
return(gg);
endsub;
run;
这个函数能简单是实现一下,excel里面的那个函数简化后的一样的功能..那么来看一个例子...
代码语言:javascript复制data a;
format x y yymmdd10.;
do x=input('2018-01-01',yymmdd10.) to input('2018-03-01',yymmdd10.);
y=input('2018-01-01',yymmdd10.);
output;
end;
run;
options cmplib=sasuser.fun;
data a1;
set a;
dt=workdate(y,x);
run;
自己造了一个简单例子,那么来看看观测...可能自定义的函数写的不太好,不过此处就是为了引出SAS可以自定义函数....
浅谈自定义函数
写的不多!准确的来说,这是写的第2个还是第三个来着...所以谈不上了解,只能套用例子改着写...也就不过多的说了,误人子弟不太好,听说SAS自定义函数可以用好几种方式,基于SAS语言是可以,C 语言也是可以的...自定义函数其实也是将函数存储到SAS的一张表中(这里感觉是和SAS定义format是一样的),然后可以将表解析出来函数来。。。就是通过option选项来让SAS知道你自定了函数,option cmplib=数据集(自定义函数储存所在的数据集...)
自定义函数的好处,让很长的代码变的精简,就类似于SAS里面的宏一样...
虽然不常见,但是我觉得还是挺好的一个简化代码的方式...前面举的例子是返回数值型的结果,那么接下来在举一个例子返回字符型结果
代码语言:javascript复制proc fcmp outlib=sasuser.fun.cgdate;
function cgdate(var1 ,var2 )$ ;
gg=put(var1*24*3600 var2,is8601dt.);
return(gg);
endsub;
run;
此处,我们定义了一个返回字符串的函数,函数可以将数值型日期,数值型时间转换成字符型的8601格式的日期...这个例子只是一个简单的转换...实际运用中当然是会稍微复杂一点,加一些条件判断啥的,实现一些填补啊啥的,这里只是一个简化版的例子...
代码语言:javascript复制data a;
set a;
Is_dt=cgdate(dat1,tim1);
run;
自定义函数编辑器
不知道大家对SAS软件的界面是不是每一个选项都点进去看了的(反正我是都点过一次..)...在SAS里面提供了一个专门的编辑函数的界面工具...
嗯,就是这样的编辑器,可以检测自定义函数编写的是否正确啥的...
虽然说SAS里面已经有很多函数了,基本上各种函数稍微组合一下就能快捷实现各种需求,但是如果是常用的、有规律的、组合稍微复杂点的、需要加条件判断的等也不妨自定义一个函数,日积月累下来就有一个自己的函数库了,和写宏一样,慢慢的积累就能很好的提高编程的效率...
今天就这么多了,后续内容,敬请期待~