加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SAS 日期函数操作

(2015-12-16 14:20:05)

1.基本设置

(1)SAS中用数值来表示日期,SAS日期值等于具体日期离1960/1/1天数。

eg:

date         SAS value 

1959-1-1      -365

1960-1-1      0

1961-1-1      365

2008-1-1      17532

(2)SAS中的日期格式:

SAS有输入输出格式,输入格式通常在input语句中使用,而输出格式通常在format语句中使用。

输入格式:常见的有以下6种。

anydtdtew.

可以读取各种日期格式                                                                        

w可以取5-32    默认的是 9

datew.        可以读取用ddmmmyy或者ddmmmyyyy形式表示的日期                            

w可以取7-32    默认的是 7 (注意:不管是输入还是输出,都没有ddmmmyyw.或者是ddmmmyyyyw.这种格式的写法,都是写成date9.

ddmmyyw.  可以读取用ddmmyy或者ddmmyyyy形式表示的数据                                  

w可以取6-32    默认的是6

mmddyyw.  可以读取用mmddyy或者mmddyyyy形式表示的数据                                  

w可以取6-32    默认的是6

yymmddw.    可以读取用 yymmdd或者yyyymmdd形式表示的数据

w可以取6-32 默认的是6

julianw.       可以读取用yyddd或者yyyyddd形式表示的数据(表示yy年的第ddd天)    

w可以取5-32    默认的是5

输出格式,常见的有8种,前4种是最常见的

datew.   (注意:不管是输入还是输出,都没有ddmmmyyw.或者是ddmmmyyyyw.这种格式的写法,都是写成date9.  

mmddyyw.

Ddmmyyw.

Yymmddw.

julianw.   

weekdatew.

worddatew.

dayw.

3)在读取日期变量时应该根据原始数据中日期所用的格式来决定输入格式:

eg

有数据文件  08/14/1983  要读取这个日期就要在日期变量中使用一下格式:

Input  birthday  mmddyy10.

如果是14-08-1983则用:

Input  birthday  ddmmyy10.

如果是14 Aug 1983则用:

Input  birthday  ddmmmyy9.

2.SAS常见日期函数

常用日期和时间函数有:          

MDY(m,d,yr) 生成yrmd日的SAS日期值           

YEAR(date) SAS日期值date得到年           

MONTH(date) SAS日期值date得到月           

DAY(date) SAS日期值date得到日           

WEEKDAY(date) SAS日期值date得到星期几           

QTR(date) SAS日期值date得到季度值           

HMS(h,m,s) 由小时h、分钟m、秒s生成SAS时间值           

DHMS(d,h,m,s) SAS日期值d、小时h、分钟m、秒s生成SAS日期时间值  

DATEPART(dt) SAS日期时间值dt的日期部分          

INTNX(interval,from,n) 计算从from开始经过nin间隔后的SAS日期。其中interval 可以取'YEAR''QTR''MONTH''WEEK''DAY'等。           

    比如,INTNX('MONTH', '16Dec1997'd, 3)结果为199831日。注意它总是返回一个周期的开始值。      

INTCK(interval,from,to) 计算从日期from到日期to中间经过的interval间隔的个数,其中interval'MONTH'等。比如,INTCK('YEAR', '31Dec1996'd, '1Jan1998'd  

    计算199612 31日到199811日经过的年间隔的个数,结果得2,尽管这两个日期之间实际只隔1年。       

其它日期和时间函数还有DATETODAYDATETIMEDATEJULJULDATEHOURMINUTESECOND TIMETIMEPART等。

%let filedate='20Nov2010'd;

data _null;

sdate='16Jan2011'd;

edate='16feb2011'd;

actual=datdif(sdate,edate,'act/act');

days360=datdif(sdate,edate,'30.360');

conn='01feb2011 8:45'dt;

servdate=datepart(conn);

in_3m=INTNX('MONTH',&filedate,-3);

in_6m=INTNX('MONTH',&filedate,-6);

in_12m=INTNX('MONTH',&filedate,-12);

intck_day=INTCK('DAY',sdate,&filedate);

put servdate ;

put actual= days360=;

format sdate yymmdd10.;

format edate yymmdd10.;

format servdate yymmdd10.;

format in_3m yymmdd10.;

format in_6m yymmdd10.;

format in_12m yymmdd10.;

run;

proc print data=_null;

run;

 

运行结果如下图:

 http://s11/mw690/001RXX6bgy6XOFDUlceda&690日期函数操作" TITLE="SAS 日期函数操作" />


3. 格式转化

data part;

input no @@;

cards;

19880918 20120901 20100705

;

data b;

set part;

no_day=input(put(no,$8.),yymmdd10.);

format no_day yymmdd10.;

run;

proc print data=b;

run;

 

运行结果如下图所示:

 http://s2/mw690/001RXX6bgy6XOFFH59761&690日期函数操作" TITLE="SAS 日期函数操作" />


4.处理混合日期个数

data contacts;

input  @1 saleid @6 location $ @10 saledate anydtdte. amount $;

format saledate mmddyy10.;

cards;

3034 EUR 30JAN2007 1876,30

101  USA 1-30-2007 2938.00

128  USA 2-5-2007  2908.74

1345 EUR 6FEB2007  3145,60

109  USA 3-17-2007 2789.10

;

run;

 

proc print data=contacts;

run;

 

 http://s6/mw690/001RXX6bgy6XOFH1fHT65&690日期函数操作" TITLE="SAS 日期函数操作" />


5.SAS中时常会碰到IMPORT或SET的数据集中时间格式为$19.,即例如为“2011-05-09 22:19:02”;  

如何将其转换成标准的DATETIME19.格式的时间呢? 

主要用的是INPUT和SCAN函数 

实现CODE如下所示:  

DATA 逻辑库.数据集1;
 SET 逻辑库.数据集2;
 INFORMAT RECORDTIME2 DATETIME19.;
 FORMAT RECORDTIME2 DATETIME19.;
 RECORDTIME2=INPUT(SCAN(RECORDTIME,1,' '),YYMMDD10.)*24*60*60+INPUT(SCAN(RECORDTIME,2,' '),TIME8.);
RUN;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有