我需要将我在下一句中创建的每个日期分开,这样我就可以为每个日期创建一个变量。
下一个循环在一个变量中创建日期。
data _null_;
End_date= /*today()-1;*/ '30JUN2021'd;
call symput('days',intck('day',intnx("year",End_date,-1,'b'), End_date));
End_month=intnx("month",End_date,0,'e');
format End_month End_date ddmmyy10.;
run;
data _null_;
length varnew $30000.;
End_date= /*today()-1;*/ '30JUN2021'd;
do i=0 to &days.;
if i=0 then do;
varnew=put(intnx("year",End_date,-1,'b'),ddmmyy10.);
end;
else do;
if intnx("year",End_date,-1,'b')+i ne intnx("month",intnx("year",End_date,-1,'b')+i,0,'e') then do;
varnew= trim(varnew)||" "||put(intnx("year",End_date,-1,'b')+i,ddmmyy10.);
end;
else do;
varnew= trim(varnew)||" "||put(intnx("year",End_date,-1,'b')+i,ddmmyy10.)||" "||put(intnx("year",End_date,-1,'b')+i,mmyys7.);
end;
end;
end;
if End_date ne intnx("month",end_date,0,'e') then do;
call symput('varnew',trim(varnew)||" "||put(intnx("year",End_date,-1,'b')+&days.,mmyys7.)||" "||put(intnx("year",End_date,-1,'b')+&days.,mmyys7.)||"*");
end;
else do;
call symput('varnew',trim(varnew)||" "||put(intnx("year",End_date,-1,'b')+&days.,mmyys7.)||"*");
end;
run;
%put --&varnew.--;
看起来像
--01/01/2020 02/01/2020 03/01/2020 04/01/2020 05/01/2020 06/01/2020 07/01/2020 08/01/2020 09/01/2020 10/01/2020 11/01/2020
12/01/2020 13/01/2020 14/01/2020 15/01/2020 16/01/2020 17/01/2020 18/01/2020 19/01/2020 20/01/2020 21/01/2020 22/01/2020 23/01/2020
24/01/2020 25/01/2020 26/01/2020 27/01/2020 28/01/2020 29/01/2020 30/01/2020 31/01/2020 01/2020 01/02/2020 02/02/2020 03/02/2020
04/02/2020 05/02/2020 06/02/2020
所以我想为每个日期创建一个看起来像的变量
|VAR1|VAR2|VAR3|
|-------------|---------------|---------------|
|2020年1月1日|2020年2月1日| 2020年3月1日
您可以在一个步骤中完成所有这些操作。设置结束日期和开始日期,然后循环并为每个日期创建一个宏变量。call symputx()
的第一个自变量也接受函数。我们将为每个变量创建一个计数器,然后将其附加到名称var
中。
不需要创建output
语句和数据集,此处仅用于描述目的。
data dates;
end_date = '30JUN2021'd;
start_date = intnx('year', end_date, -1, 'B');
do date = start_date to end_date;
i = date-start_date+1;
output;
/* Dynamically create new macro variables named var1, var2, etc. */
call symputx(cats('var', i), put(date, ddmmyys10.) );
end;
format end_date start_date date ddmmyys10.;
run;
%put var1: &var1;
%put var2: &var2;
%put var3: &var3;
输出:
var1: 01/01/2020
var2: 02/01/2020
var3: 03/01/2020
如果您试图创建数据步骤变量,其中每个日期有一个变量,则可以对数组执行类似的操作。您不能动态分配数组大小,因此我们将使用宏变量设置结束/开始日期和数组大小。
/* Create date constants for array */
%let end_date = '30JUN2021'd;
%let start_date = %sysfunc(intnx(year, %sysfunc(putn(&end_date, 8.)), -1, B));
%let n_dates = %eval(%sysfunc(putn(&end_date., 8.)) - &start_date.+1);
/* Generate dates for each array variable */
data dates;
end_date = &end_date.;
start_date = &start_date.;
array var[&n_dates.];
do date = start_date to end_date;
i = date-start_date+1;
var[i] = date;
end;
format start_date end_date var: ddmmyys10.;
run;
输出:
var1 var2 var3
01/01/2020 02/01/2020 03/01/2020