使用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创建日历表相关推荐
- mysql创建日历表,可以按日或按月增加数据
统计一段时间内每天的各种数据,发现某天没有的数据没法显示出来,所以这时候用一张日历表去联合查询即能获得每天的数据 创建日历表用到ADDDATE这个系统函数,这个函数会自动为给定的日期添加指定的时间间隔 ...
- 【PowerBI】各种常用度量值函数以及创建日历表
近期在统计日活量和月活量,要求日活量和月活量为访问量去重的数据,且数据不会根据筛选器的开始日期而变动,另外还有计算月累计,季度累计,年累计等,下面为用到的些度量值及其函数 1.创建日历表 //根据lo ...
- mysql 创建日历表
日历表包括: 日期,星期,季度,月份,第几周. 表的结构 以及存储过程如下: [sql] view plain copy CREATE TABLE `dim_day` ( `ID` int(11) N ...
- mysql 日期区间创建_按日期范围统计数据
第一步:mysql使用存储过程,创建日历表 创建日历表: CREATE TABLE `capacity_common_date` ( `ID` int(11) NOT NULL AUTO_INCREM ...
- SAS概念知识点 (复习1)
概念部分 作业一: g) SAS语句通常以一个关键字开头.每一个SAS语句都以分号结尾.可以使用 contents过程查看SAS 数据集的描述部分.字符型变量长度最多能有 32767 字符长,并且每个 ...
- MySql生成日历表
mysql使用存储过程,创建日历表: 准备日历表: CREATE TABLE `m_dim_day` ( `ID` int(11) NOT NULL AUTO_INCREMENT,`DAY_ID` v ...
- SAS操作知识点记录
SAS数据集 sas数据集是由sas创建并且处理的文件 浏览描述部分 contents过程可以显示sas数据集的描述部分 procproc contents DATA=SAS-data-set +变量 ...
- SAS | macro variables macro
宏变量macro variable 宏变量是SAS宏工具的一部分,该工具用于扩展和定制SAS,并用于减少执行常见任务所必须输入的程序代码量 automatic macro variables自动宏变量 ...
- 从程序员到数据科学家:SAS 编程基础 (06)- DATA步与PDV
在BASE SAS 中,DATA 语句用于开始一个数据步, 后续为若干DATA步特定的语句:SAS数据步结束于下一个 DATA 步或 PROC 步开始之处,或者结束于后续显式指定的RUN语句. 注意: ...
最新文章
- Sharepoint中遭遇The Path specified cannot be used at this time.
- Google Play应用上架流程(含踩坑经验)
- html中井号的作用,html5 css选择器 井号, 句点的区别
- 自定义线程池内置线程池的使用 ThreadPoolExecutor和Executorservice 示例与注意事项
- Liunx的常用命令
- 带有Kafka和ZeroMQ的分布式类星体演员
- 使用工厂方法模式设计最佳实践
- UVA 1645 - Count(简单DP)
- iOS 的 XMPPFramework 简介
- 你真的会用Vue-cli脚手架和Element-ui进行项目创建吗?
- 一流设计师导航|16map,一款强大且智能的设计师导航网站
- 相位延迟和群延迟的区别
- linux维护rpm 数据库,Linux运维知识之linux rpm命令详细介绍
- Leetcode每日一题:116.populating-next-right-pointers-in-each-node(填充每个节点的下一个右侧节点指针)
- mysql用shell脚本链接数据库进行操作
- WPS怎么统计相同名称的数据_批量操作同一格式的多表格汇总统计
- 如何修改PDF文件内的文字的字体和颜色?
- android mtklog,Mtklog结构及分析
- 200以后最小质数:
- Java网络编程socket基础学习
热门文章
- 关于和||的优先级问题
- 秋招面试总结(计算机视觉、3D算法、三维重建、相机标定等岗位)
- 【项目】健康项目day5总结
- RichEdit的用法总结
- codeblocks||=== Build file: no target in no project (compiler: unknown) ===
- mongodb数据文件格式
- 2019CCPC网络赛部分题解
- Office VBA开发经典-中级进阶卷(75元包邮)
- android实现微信网页浏览、QQ下拉效果SlidingLayout
- 如何用不到200行代码实现经典小游戏贪吃蛇,附源代码及详细实现思路