繁体   English   中英

SAS 从一个变量中分离日期

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM