在SAS EG中计算工作日
大家好,一天中的好时光! 这是我需要解决的问题,如果你能帮助我,我将非常感激。 我有一些数据集,它只包含一个变量日期格式。 例如: 第二个数据集是为期5年的天数-假期。 例如: 等等,所有这些天都不是工作日 情况是,我需要计算从第一个数据集到现在的每次观察的工作日数。看来我得数数天数了在SAS EG中计算工作日,sas,Sas,大家好,一天中的好时光! 这是我需要解决的问题,如果你能帮助我,我将非常感激。 我有一些数据集,它只包含一个变量日期格式。 例如: 第二个数据集是为期5年的天数-假期。 例如: 等等,所有这些天都不是工作日 情况是,我需要计算从第一个数据集到现在的每次观察的工作日数。看来我得数数天数了 “现在日期”减去日期(从第一个数据集算起)和减去第二个数据集的天数(从第一个数据集算起),其中日期(从第一个数据集算起)
“现在日期”减去日期(从第一个数据集算起)和减去第二个数据集的天数(从第一个数据集算起),其中日期(从第一个数据集算起)
data mon_fri;
do date = "01JAN2014"d to "31DEC2016"d;
if weekday(date) in (2:6) then output;
end;
format date date9.;
run;
然后,我们将创建一个包含我们刚刚创建的所有日期的表,减去表holidays中的假期。我们将该表放入一个名为myLib的库中,并将日期列重命名为“Begin”,以符合SAS自定义间隔
libname myLib "some/place/on/your/drive";
data mylib.workdays(RENAME=(date=Begin));
merge mon_fri (in=weekday)
Holidays (in=holiday);
by date;
if weekday and not holiday then output;
run;
现在我们设置了一个自定义的时间间隔,我们称之为“工作日”
从那以后,你所要做的就是这样:
data dateCalculations;
set mydata;
numOfDays = intck("workdays", theDate, today());
run;
SAS将负责计算开始日期(称为日期的列)和结束日期(今天的日期)之间的日期数(workdays数据集中的行)
Et voilá!这很好,也很有帮助。我使用两个不同的SAS系统(都在远程Unix服务器上)。设置intervalds选项似乎只在其中一个系统上起作用。我复制/粘贴相同的代码,而在另一个系统上什么也没有发生-没有警告,没有错误,根本不起作用 以下是我的设置方式(从1950年1月开始,从Yahoo!Finance下载标准普尔500每日数据的CSV):
在系统1上,这很好。在系统2上,变量datadays的值为0。我已经检查了设置intervalds选项是否有系统管理员覆盖,但没有。这在给定系统上可能不起作用,还有其他原因吗?谢谢,但我需要计算节假日+周末的值OK,然后再输入每个date您需要像我一样在数据集中计数,并使用该数据集定义您的自定义间隔!您可以使用(1,7)中的
工作日(日期)获取周末,然后将它们与您的假日连接起来,按日期排序,将列重命名为“开始”,您就可以开始了!
libname myLib "some/place/on/your/drive";
data mylib.workdays(RENAME=(date=Begin));
merge mon_fri (in=weekday)
Holidays (in=holiday);
by date;
if weekday and not holiday then output;
run;
options intervalds=(workdays=mylib.workdays);
data dateCalculations;
set mydata;
numOfDays = intck("workdays", theDate, today());
run;
PROC IMPORT DATAFILE="sp500_1950_2016.csv"
OUT=sp500_1950_2016
DBMS=DLM
REPLACE;
delimiter=',';
getnames=yes;
RUN;
data trading_days;
set sp500_1950_2016 (keep = date rename=(date=begin));
where year(begin) < 2017;
run;
options intervalds=(TradingDay=trading_days) ;
data ops2; set operations_master; where ~missing(inception);
if missing(enddate) then enddate = '31dec2016'd;
datadays = INTCK('TradingDay',inception,enddate);run;
proc univariate; var datadays;run;quit;