计算SAS EG的工作日

时间:2016-05-11 06:30:14

标签: sas

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

var errorList = table_2.Where(y => (y.OrderNo == "1234")).Select(y => y.Version).Distinct();
table_1.Where(y => (y.OrderNo == "1234" && y.Version.NOT_IN(erriList)));

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

{{1}}

等等,这些日子都不是工作日。

案例是我需要计算从第一个数据集到现在每个观察日期的工作日数。我似乎需要计算天数

“现在日期”减去日期(来自第一个数据集)和减去第二个数据集与假期的天数(计数(日期),其中日期(来自第一个数据集)< date<“Now”

2 个答案:

答案 0 :(得分:2)

您可以定义自己的间隔类型,以便与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;

然后我们将创建一个表格,其中包含我们刚刚创建的所有日期,减去表格假期中的假期。我们将表格放在名为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;

现在我们设置一个自定义间隔,我们简称为“工作日”。

options intervalds=(workdays=mylib.workdays);

从那里,你剩下要做的就是这样:

data dateCalculations;
  set mydata;
  numOfDays = intck("workdays", theDate, today());
run;

SAS将负责计算将startdate(名为theDate的列)与enddate(今天的日期)分开的日期数(工作日数据集中的行)。

Etvoilà!

答案 1 :(得分:0)

这很精彩,非常有帮助。我使用两个不同的SAS系统(都在远程Unix服务器上)。设置intervalds选项似乎只适用于其中一个。我复制/粘贴相同的代码,另一方面没有任何反应 - 没有警告,没有错误,它根本不起作用。

以下是我如何设置它(从S / amp; P500下载Yahoo! Finance的CSV,每日数据,从1950年1月开始):

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) ;

然后我这样称呼它来计算我应该从基金开始到2016年12月31日或基金关闭时的观察数量,以较早者为准:

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;

在系统1上,这很好用。在系统2上,变量datadays得到0。我已经检查过在设置intervalds选项时是否有sys管理覆盖,但是没有。还有另一个原因导致这可能不适用于给定的系统吗?