生活随笔
收集整理的這篇文章主要介紹了
使用SAS创建日历表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在使用SAS進行數據分析時候經常需要對日期進行處理和調用,因為數據庫的文件大部分都有yyyymmdd格式的日期后綴。借助日歷表我們就可以更加靈活的對數據集進行調用。
下面我們使用SAS創建日歷表calendar,該表共包含十個字段,序號n,日期date,年year,月month,日day,星期幾weekday,是否是工作日isworkday,對應當月第幾個工作日workday,當月工作日天數workdays,對應的工作日working_day(如果是工作日則對應自身,如果是非工作日則對應上一個工作日)
%let dd
= 20191230;
data
public;input date
:date9
. isworkday
:best12
. holiday_nm
:$
20.;format date yymmdd10
.;datalines
;'01jan2020'd
0 元旦
'19jan2020'd
1 春節調班
'24jan2020'd
0 春節
'25jan2020'd
0 春節
'26jan2020'd
0 春節
'27jan2020'd
0 春節
'28jan2020'd
0 春節
'29jan2020'd
0 春節
'30jan2020'd
0 春節
'01feb2020'd
1 春節調班
'04apr2020'd
0 清明
'05apr2020'd
0 清明
'06apr2020'd
0 清明
'26apr2020'd
1 五一調班
'01may2020'd
0 五一
'02may2020'd
0 五一
'03may2020'd
0 五一
'04may2020'd
0 五一
'05may2020'd
0 五一
'09may2020'd
1 五一調班
'25jun2020'd
0 端午
'26jun2020'd
0 端午
'27jun2020'd
0 端午
'28jun2020'd
1 端午調班
'27sep2020'd
1 國慶調班
'01oct2020'd
0 國慶
'02oct2020'd
0 國慶
'03oct2020'd
0 國慶
'04oct2020'd
0 國慶
'05oct2020'd
0 國慶
'06oct2020'd
0 國慶
'07oct2020'd
0 國慶
'08oct2020'd
0 國慶
'10oct2020'd
1 國慶調班
;
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
;
總結:通過日歷表我們就可以把日期對應的工作日調整為yyyymmdd的格式,再賦值給宏變量,結合循環可以達到事半功倍的效果。
總結
以上是生活随笔為你收集整理的使用SAS创建日历表的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。