【问题标题】:Counting working days in SAS EG在 SAS EG 中计算工作日
【发布时间】:2016-05-11 06:30:13
【问题描述】:

大家好,美好的一天! 这是我需要解决的情况,如果您能帮助我,我将非常感激。 我有一些数据集,它只包含一种可变日期格式。 示例:

01JAN2016
06JAN2016
15FEB2016

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

01JAN2016
02JAN2016

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

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

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

【问题讨论】:

    标签: sas


    【解决方案1】:

    您可以定义自己的间隔类型以与 SAS 函数 intck 和 intnx 一起使用。操作方法如下:

    首先为您有假期的年份创建一个工作日表,直到现在(或未来)年份。

    在这里,我们将首先包括从 2014 年到 2016 年的所有工作日。这是假设您不想计算周末天数。如果不是这种情况,只需修改代码,以便不应用条件“weekday(date) in (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 的库中,并将日期列重命名为“开始”以符合 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 将负责计算将开始日期(称为 theDate 的列)与结束日期(今天的日期)分开的日期(工作日数据集中的行)数。

    等等!

    【讨论】:

    • 谢谢,但我需要计算假期+周末
    • 好吧,然后像我一样将您需要计入数据集中的每个日期输入并使用该数据集定义您的自定义间隔!您可以使用weekday(date) in (1,7) 获得周末,然后将这些与您的假期连接起来,按日期排序,将列重命名为“开始”,然后您就可以开始了!
    【解决方案2】:

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

    这是我的设置方式(从 Yahoo! Finance 下载标准普尔 500 指数的 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选项时是否有系统管理员覆盖,但没有。还有其他原因导致这可能无法在给定系统上运行吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      相关资源
      最近更新 更多