在SAS EG中计算工作日

在SAS EG中计算工作日,sas,Sas,大家好,一天中的好时光! 这是我需要解决的问题,如果你能帮助我,我将非常感激。 我有一些数据集,它只包含一个变量日期格式。 例如: 第二个数据集是为期5年的天数-假期。 例如: 等等,所有这些天都不是工作日 情况是,我需要计算从第一个数据集到现在的每次观察的工作日数。看来我得数数天数了 “现在日期”减去日期(从第一个数据集算起)和减去第二个数据集的天数(从第一个数据集算起),其中日期(从第一个数据集算起)

大家好,一天中的好时光! 这是我需要解决的问题,如果你能帮助我,我将非常感激。 我有一些数据集,它只包含一个变量日期格式。 例如:

第二个数据集是为期5年的天数-假期。 例如:

等等,所有这些天都不是工作日

情况是,我需要计算从第一个数据集到现在的每次观察的工作日数。看来我得数数天数了


“现在日期”减去日期(从第一个数据集算起)和减去第二个数据集的天数(从第一个数据集算起),其中日期(从第一个数据集算起)您可以定义自己的间隔类型,以便与SAS函数intck和intnx一起使用。方法如下:

首先,创建一个工作日表,列出从现在(或未来)到现在(或未来)有假期的年份

在这里,我们将首先包括2014年到2016年的所有工作日。这是假设您不想计算周末。如果不是这样,只需修改代码,使“工作日(日期)在(2:6)”的条件不适用。您将获得全年365天

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;