嗨,祝大家一日美好时光! 这是我需要解决的案例如果你能帮助我,我将非常感激。 我有一些数据集,它只包含一个可变日期格式。 例如:
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”
答案 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管理覆盖,但是没有。还有另一个原因导致这可能不适用于给定的系统吗?