有时候你们没在简书看到我的文章,有可能是被锁定了,上一篇就是被锁定了,莫名其妙的,不知道是不是涉及到政Z。
今天继续讲几个关于时间处理的函数,写SDTM或者ADaM一般用的比较少,但是在写DVP的时候可能用的上并且有时候能达到事半功倍的效果。
一:tod函数
一般转换时间的时候,用的最多的一般是time8等.
data test;
input tim $;
cards;
7:42
20:47
19:20:22
9:30
;
run;
data test2;
set test;
tim2=input(tim,time8.);
format tim2 time8.;
run;
data test3;
set test2;
tim3=put(tim2,tod8.);
tim4=put(tim2,time8.);
run;
但是time函数,如果时间是10以前的,并不会在个位数前补上0,但是tod函数会帮你补上0,但是要注意的是tod函数只能将数值型转换成字符型,但是time函数能够相互转换。
二:is8601dt19./e8601dt19. 效果看图片
data test;
a="2011-01-15T12:55:00";
b=input(a,is8601dt19.);
c=put(b,is8601dt19.);
d=put(b,datetime20.);
e=put(b,e8601dt19.);
run;
is8601dt19.这个格式既能将字符型变量转化为数值型变量,又能将数值型变量转化为字符型变量。而datetime20.只能将数值型变量转化为字符型变量,转化后的形式也略有差异,为15JAN2011:12:55:00形式,没有中间的那个“T”。
三:yymmdd10./e8601da.效果看图片
data test;
a="2021-01-15";
b=input(a,yymmdd10.);
c=input(a,e8601da.);
e="2021-1-15";
f=input(e,yymmdd10.);
g=input(e,e8601da.);
run;
e8601da.则和常用的yymmdd10.类似,不过不识别"2021-8-5”这种形式,而必须是"2021-08-05",就是日期要完整。所以可以看到变量g是空的。
所以为了解决第三个的问题,有以下函数可以用:
四:anydtdtm.函数,能处理一些不规范的时间格式,比如上面的日期函数有些就不适用下面的日期。这个功能挺强大的。(代码放简书)
data b;
a1="2011-01-15T12:55:00"; **可以识别;
b1=input(a1,anydtdtm.);
a2="2011-01-16"; **可以识别;
b2=input(a2,anydtdtm.);
a3="2021-01" ; /*只有年月可以读取出来,很多这种不完整的日期,转换成数值型后可以方便比较*/
b3=input(a3,anydtdtm.);
a4="2011-01-15T12:55"; /*时间格式不完整读取不出,即使有 时分*/
b4=input(a4,anydtdtm.);
a5="2021"; /*只有年份读取不出*/
b5=input(a5,anydtdtm.);
a6="2011/01/16";
b6=input(a6,anydtdtm.); **斜杠亦可以识别;
a7="2011-01-15 12:55:00"; **时间日期没有 T 也可以识别;
b7=input(a7,anydtdtm.);
run;
5:anydtdte.函数,自动填补最早的日期。
data test;
a="2021-08";
b=input(a,anydtdte.);
format b yymmdd10.;
run;
但是只有年份不可以。
如果想填补最后一天呢?可以利用INTNX函数,来自一位网友的分享:
data test;
format b c yymmdd10.;
a="2021-08";
b=input(a,anydtdte.);
c=intnx('month',b,0,'e');
run;
网友评论