[英]SAS separete Dates from one variable
我需要分隔我在下一句中创建的每个日期,以便我能够为每个日期创建一个变量。
下一个循环在一个变量中创建日期。
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()
的第一个参数也接受函数。 我们将为每个变量创建一个计数器,然后将其 append 命名为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;
Output:
var1: 01/01/2020
var2: 02/01/2020
var3: 03/01/2020
如果您尝试创建每个日期都有一个变量的数据步骤变量,您可以使用 arrays 执行类似的操作。 您不能动态分配数组大小,因此我们将使用宏变量设置结束/开始日期和数组大小。
/* 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;
Output:
var1 var2 var3
01/01/2020 02/01/2020 03/01/2020
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.