Sas 如何使其正常工作?复活节周末给我的日子不对

Sas 如何使其正常工作?复活节周末给我的日子不对,sas,Sas,所以,我想找出给定日期前的第五个工作日,这意味着不包括周末和银行假期。在正常的一周,它似乎工作正常,但如果我尝试2015年4月7日的开始日期,即复活节周五、周末和复活节周一之后的周二,它返回的第五天就错了 txt文件包含: bhol 01jan2015 03apr2015 06apr2015 04may2015 25may2015 31aug2015 25dec2015 28dec2015 代码如下: options mprint mlogic symbolgen; proc import

所以,我想找出给定日期前的第五个工作日,这意味着不包括周末和银行假期。在正常的一周,它似乎工作正常,但如果我尝试2015年4月7日的开始日期,即复活节周五、周末和复活节周一之后的周二,它返回的第五天就错了

txt文件包含:

bhol
01jan2015
03apr2015
06apr2015
04may2015
25may2015
31aug2015
25dec2015
28dec2015
代码如下:

options mprint mlogic symbolgen;

proc import out=bhols datafile="C:\Users\me\Documents\bhols.txt" dbms=csv replace;
label;
run;

data bholdates;
  set bhols;
  sasdate=input(bhol,date9.);
  today=input("07apr2015",date9.);
  weekday=weekday(today);
  call symputx("todayd",today,"g");
run;

proc sql ;
  select sasdate into :bhols separated by " "
  from bholdates;
quit;

%macro five;
data test;
/*  format today day day5 date9.;*/
  retain count;
  count=0;
  today=&todayd;
  day=&todayd-1;
  do until(count=1);
  weekday=weekday(day);
  if day in(&bhols) or weekday in(1,7) then do;
  day=day-1;
  end;
  if day not in(&bhols) and weekday not in(1,7) then do;
    count=count+1;
    weekday5=weekday(day);
    day5=day;
    day=day-1;
  end;
  end;
run;
%mend;
%five;

我希望变量day5包含给定日期之前的第五个工作日。

我会尝试以下方法:

/* Step back 5 days */
do i = 1 to 5;
  day - 1;
  /* Step back an extra day for each weekend or bank holiday encountered */
  do while(weekday(day) in (1, 7) or day in (&bhols.));
    day - 1;
  end;
end;
do i=1到5
将在工作日内逐步后退,而
do while()
将确保您跨越所有周末和银行假日,即使它们相邻。

最简单的方法(我这样做的数量相当大)就是找到所有不是周末和假日的日期。在值之前查找值5

/*All weekdays in the year*/
data not_hols;
format date date9.;
do date="01JAN2015"d to "31DEC2015"d;
    if weekday(date) not in (6,7) then
        output;
end;
run;

/*Delete the holidays*/
proc sql noprint;
delete from not_hols
where date in (select bhols from bhols);
quit;

/*Add an index*/
data not_hols;
set not_hols;
index = _n_;
run;

/*Date to find*/
%let find_dt=07apr2015;

/*Look up the date based on the index being -5 from the value of
  find_dt */
proc sql noprint;
select date format date9.
    into :back5
from not_hols
where index = (
    select index-5 
    from not_hols 
    where date = "&find_dt"d
);
quit;

%put Back 5 from &find_dt = &back5;

创建
NOT_HOLS
数据的第一部分可以完成一次并保存在永久位置。然后你可以使用SQL来获取你需要的日期,当你需要它时,你会考虑创建你自己的自定义间隔吗?如果您在文件中有假期,并且SAS 9.3+是一个不错的选择,那么您可以使用intck/intnx函数。