生活随笔
收集整理的這篇文章主要介紹了
使用SAS创建日历表
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在使用SAS進(jìn)行數(shù)據(jù)分析時(shí)候經(jīng)常需要對(duì)日期進(jìn)行處理和調(diào)用,因?yàn)閿?shù)據(jù)庫(kù)的文件大部分都有yyyymmdd格式的日期后綴。借助日歷表我們就可以更加靈活的對(duì)數(shù)據(jù)集進(jìn)行調(diào)用。
下面我們使用SAS創(chuàng)建日歷表calendar,該表共包含十個(gè)字段,序號(hào)n,日期date,年year,月month,日day,星期幾weekday,是否是工作日isworkday,對(duì)應(yīng)當(dāng)月第幾個(gè)工作日workday,當(dāng)月工作日天數(shù)workdays,對(duì)應(yīng)的工作日working_day(如果是工作日則對(duì)應(yīng)自身,如果是非工作日則對(duì)應(yīng)上一個(gè)工作日)
%let dd
= 20191230;
data
public;input date
:date9
. isworkday
:best12
. holiday_nm
:$
20.;format date yymmdd10
.;datalines
;'01jan2020'd
0 元旦
'19jan2020'd
1 春節(jié)調(diào)班
'24jan2020'd
0 春節(jié)
'25jan2020'd
0 春節(jié)
'26jan2020'd
0 春節(jié)
'27jan2020'd
0 春節(jié)
'28jan2020'd
0 春節(jié)
'29jan2020'd
0 春節(jié)
'30jan2020'd
0 春節(jié)
'01feb2020'd
1 春節(jié)調(diào)班
'04apr2020'd
0 清明
'05apr2020'd
0 清明
'06apr2020'd
0 清明
'26apr2020'd
1 五一調(diào)班
'01may2020'd
0 五一
'02may2020'd
0 五一
'03may2020'd
0 五一
'04may2020'd
0 五一
'05may2020'd
0 五一
'09may2020'd
1 五一調(diào)班
'25jun2020'd
0 端午
'26jun2020'd
0 端午
'27jun2020'd
0 端午
'28jun2020'd
1 端午調(diào)班
'27sep2020'd
1 國(guó)慶調(diào)班
'01oct2020'd
0 國(guó)慶
'02oct2020'd
0 國(guó)慶
'03oct2020'd
0 國(guó)慶
'04oct2020'd
0 國(guó)慶
'05oct2020'd
0 國(guó)慶
'06oct2020'd
0 國(guó)慶
'07oct2020'd
0 國(guó)慶
'08oct2020'd
0 國(guó)慶
'10oct2020'd
1 國(guó)慶調(diào)班
;
run
;
data calendar_01
;do n
= 1 to
367;date
= input("&dd.", yymmdd
.) + n
;weekday
= weekday(date
);year
= year(date
);month
= month(date
);day
= day(date
);if workday in
(7, 1) then isworkday
= 0;else isworkday
= 1;output
;end
;format date yymmdd10
.;
run
;
proc sql
;
create table
calendar_adj(drop
= isworkday1
) as
select
a
.*
,coalesce(b
.isworkday
, a
.isworkday1
) as isworkday
,b
.holiday_nm
from
calendar_01(rename
= (isworkday
= isworkday1
)) as a
left join
public as b on a
.date
= b
.date
;
quit
;
proc sort data
= calendar_adj out
= calendar_adj_sorted
;
by year month day
;
run
;
data calendar_adj2
;set calendar_adj_sorted
;by year month day
;retain workday
;if first
.month then workday
= 0;workday
= sum(workday
, isworkday
);
run
;
data calendar_workdays
;set calendar_adj_sorted
;by year month day
;retain workdays
;if first
.month then workdays
= 0;workdays
= sun(workdays
, isworkday
);if last
.month then output
;run
;proc sql
;create table calendar_adj3 asselecta
.*
,b
.workdaysfrom calendar_adj2 as a left join calendar_workdays as b on a
.year
= b
.year and a
.month
= b
.monthorder by n
;quit
;
data calendar
;set calendar_adj3
;if _n_
= 1 then working_day
= date
;else if isworkday
= 0 then working_day
= lag1(date
)else working_day
= lag0(date
)format working_day yymmdd10
.;run
;
總結(jié):通過(guò)日歷表我們就可以把日期對(duì)應(yīng)的工作日調(diào)整為yyyymmdd的格式,再賦值給宏變量,結(jié)合循環(huán)可以達(dá)到事半功倍的效果。
總結(jié)
以上是生活随笔為你收集整理的使用SAS创建日历表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。