在使用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创建日历表相关推荐

  1. mysql创建日历表,可以按日或按月增加数据

    统计一段时间内每天的各种数据,发现某天没有的数据没法显示出来,所以这时候用一张日历表去联合查询即能获得每天的数据 创建日历表用到ADDDATE这个系统函数,这个函数会自动为给定的日期添加指定的时间间隔 ...

  2. 【PowerBI】各种常用度量值函数以及创建日历表

    近期在统计日活量和月活量,要求日活量和月活量为访问量去重的数据,且数据不会根据筛选器的开始日期而变动,另外还有计算月累计,季度累计,年累计等,下面为用到的些度量值及其函数 1.创建日历表 //根据lo ...

  3. mysql 创建日历表

    日历表包括: 日期,星期,季度,月份,第几周. 表的结构 以及存储过程如下: [sql] view plain copy CREATE TABLE `dim_day` ( `ID` int(11) N ...

  4. mysql 日期区间创建_按日期范围统计数据

    第一步:mysql使用存储过程,创建日历表 创建日历表: CREATE TABLE `capacity_common_date` ( `ID` int(11) NOT NULL AUTO_INCREM ...

  5. SAS概念知识点 (复习1)

    概念部分 作业一: g) SAS语句通常以一个关键字开头.每一个SAS语句都以分号结尾.可以使用 contents过程查看SAS 数据集的描述部分.字符型变量长度最多能有 32767 字符长,并且每个 ...

  6. MySql生成日历表

    mysql使用存储过程,创建日历表: 准备日历表: CREATE TABLE `m_dim_day` ( `ID` int(11) NOT NULL AUTO_INCREMENT,`DAY_ID` v ...

  7. SAS操作知识点记录

    SAS数据集 sas数据集是由sas创建并且处理的文件 浏览描述部分 contents过程可以显示sas数据集的描述部分 procproc contents DATA=SAS-data-set +变量 ...

  8. SAS | macro variables macro

    宏变量macro variable 宏变量是SAS宏工具的一部分,该工具用于扩展和定制SAS,并用于减少执行常见任务所必须输入的程序代码量 automatic macro variables自动宏变量 ...

  9. 从程序员到数据科学家:SAS 编程基础 (06)- DATA步与PDV

    在BASE SAS 中,DATA 语句用于开始一个数据步, 后续为若干DATA步特定的语句:SAS数据步结束于下一个 DATA 步或 PROC 步开始之处,或者结束于后续显式指定的RUN语句. 注意: ...

最新文章

  1. Sharepoint中遭遇The Path specified cannot be used at this time.
  2. Google Play应用上架流程(含踩坑经验)
  3. html中井号的作用,html5 css选择器 井号, 句点的区别
  4. 自定义线程池内置线程池的使用 ThreadPoolExecutor和Executorservice 示例与注意事项
  5. Liunx的常用命令
  6. 带有Kafka和ZeroMQ的分布式类星体演员
  7. 使用工厂方法模式设计最佳实践
  8. UVA 1645 - Count(简单DP)
  9. iOS 的 XMPPFramework 简介
  10. 你真的会用Vue-cli脚手架和Element-ui进行项目创建吗?
  11. 一流设计师导航|16map,一款强大且智能的设计师导航网站
  12. 相位延迟和群延迟的区别
  13. linux维护rpm 数据库,Linux运维知识之linux rpm命令详细介绍
  14. Leetcode每日一题:116.populating-next-right-pointers-in-each-node(填充每个节点的下一个右侧节点指针)
  15. mysql用shell脚本链接数据库进行操作
  16. WPS怎么统计相同名称的数据_批量操作同一格式的多表格汇总统计
  17. 如何修改PDF文件内的文字的字体和颜色?
  18. android mtklog,Mtklog结构及分析
  19. 200以后最小质数:
  20. Java网络编程socket基础学习

热门文章

  1. 关于和||的优先级问题
  2. 秋招面试总结(计算机视觉、3D算法、三维重建、相机标定等岗位)
  3. 【项目】健康项目day5总结
  4. RichEdit的用法总结
  5. codeblocks||=== Build file: no target in no project (compiler: unknown) ===
  6. mongodb数据文件格式
  7. 2019CCPC网络赛部分题解
  8. Office VBA开发经典-中级进阶卷(75元包邮)
  9. android实现微信网页浏览、QQ下拉效果SlidingLayout
  10. 如何用不到200行代码实现经典小游戏贪吃蛇,附源代码及详细实现思路