专栏首页SAS程序分享号号号SAS-关于日期处理的那些事...

SAS-关于日期处理的那些事...

在编程过程中,日期、时间的处理是很常见的,SAS中也有很多日期处理相关的语法或函数,那么今天就与小编一起来看看,针对日期、时间的哪些编程的语句....

一句话,几个函数

以前在人大经济论坛上一个很经典的帖子...奥,记得不是很清楚了,大致就是输入一个日期...然后噼里啪啦出一大串结果...那么接下来就来还原一下,那个帖子是如何经典的...

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的数字..反正我是遇到过的...那么接下来就看看这种情况如何解决..

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自定义函数的一个简单小例子...

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里面的那个函数简化后的一样的功能..那么来看一个例子...

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里面的宏一样...

虽然不常见,但是我觉得还是挺好的一个简化代码的方式...前面举的例子是返回数值型的结果,那么接下来在举一个例子返回字符型结果

proc fcmp outlib=sasuser.fun.cgdate;
function cgdate(var1 ,var2 )$ ;
gg=put(var1*24*3600+var2,is8601dt.);
return(gg);
endsub;
run;

此处,我们定义了一个返回字符串的函数,函数可以将数值型日期,数值型时间转换成字符型的8601格式的日期...这个例子只是一个简单的转换...实际运用中当然是会稍微复杂一点,加一些条件判断啥的,实现一些填补啊啥的,这里只是一个简化版的例子...

data a;
set a;
Is_dt=cgdate(dat1,tim1);
run;

自定义函数编辑器

不知道大家对SAS软件的界面是不是每一个选项都点进去看了的(反正我是都点过一次..)...在SAS里面提供了一个专门的编辑函数的界面工具...

嗯,就是这样的编辑器,可以检测自定义函数编写的是否正确啥的...

虽然说SAS里面已经有很多函数了,基本上各种函数稍微组合一下就能快捷实现各种需求,但是如果是常用的、有规律的、组合稍微复杂点的、需要加条件判断的等也不妨自定义一个函数,日积月累下来就有一个自己的函数库了,和写宏一样,慢慢的积累就能很好的提高编程的效率...

今天就这么多了,后续内容,敬请期待~

本文分享自微信公众号 - SAS程序分享号号号(xiaocgn),作者:setup~

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ODS Output RTF(Table Listing)

    在SAS实际编程过程中经常会用到Ods 与report来输出table/listing

    Setup
  • Macro-frq_missing

    %frq_missing(inds=如何需要check的数据集,outds=缺失结果输出的数据集,sasver=SAS语言的版本/CN 或EN);

    Setup
  • SAS-坐标表的实现

    年底啦,节日有点多,首先小编祝大家圣诞快乐。今天小编打算分享的是SAS中坐标表(axistable)的实现及常见用法。

    Setup
  • SpringBoot配置EhCache缓存

    在 src/main/resources 目录下创建 ehcache.xml 文件,内容如下:

    崔笑颜
  • AWS CloudFront CDN + S3 CORS 跨域访问的问题

    在研究 https://observablehq.com/ 的载入数据的时候,我们会发现如果你数据存在 S3 上使用 CloudFront 作为 CDN 的时候...

    HoneyMoose
  • mongodb导出和导入

    小贝壳
  • Spring MVC中使用Swagger生成API文档

    实际项目中非常需要写文档,提高Java服务端和Web前端以及移动端的对接效率。 听说Swagger这个工具,还不错,就网上找了些资料,自己实践了下。 一:Sw...

    Java架构师历程
  • 应用深度学习EEGNet来处理脑电信号

    脑机接口(BCI)使用神经活动作为控制信号,实现与计算机的直接通信。这种神经信号通常是从各种研究透彻的脑电图(EEG)信号中挑选出来的。卷积神经网络(CNN)主...

    脑机接口社区
  • PageObject(PO)设计模式在 UI 自动化中的实践总结(以 QQ 邮箱登陆为例)

    https://martinfowler.com/bliki/PageObject.html

    霍格沃兹测试开发
  • 8.1 函数第 8 章 函数与程序设计

    通过第 5 章到第 7 章的阅读,我们已经知道了怎么声明变量(第 5 章),怎么写表达式和语句(第 6 章),怎么将输入 \ 输出参数绑定到语义词(第 7 章)...

    代码咖啡

扫码关注云+社区

领取腾讯云代金券