日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用SAS创建日历表

發布時間:2024/3/12 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用SAS创建日历表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在使用SAS進行數據分析時候經常需要對日期進行處理和調用,因為數據庫的文件大部分都有yyyymmdd格式的日期后綴。借助日歷表我們就可以更加靈活的對數據集進行調用。
下面我們使用SAS創建日歷表calendar,該表共包含十個字段,序號n,日期date,年year,月month,日day,星期幾weekday,是否是工作日isworkday,對應當月第幾個工作日workday,當月工作日天數workdays,對應的工作日working_day(如果是工作日則對應自身,如果是非工作日則對應上一個工作日)

/*dd為上一年最后一個工作日,元旦假期對應到該工作日*/ %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;/*使用do循環創建一整年的日歷日,并通過星期來判斷是否是工作日,需要注意的是SAS weekday返回的星期的數字是從星期天開始,依次返回1,2,3,4,5,6,7*/ 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创建日历表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。