Создать макро даты в цикле - PullRequest
0 голосов
/ 07 мая 2018

Я написал ниже часть, чтобы получить третий месяц от даты макроса.

%let date=2017-01-01; 
%let a_SASdate=%sysfunc(inputn(&date.,yymmdd10.)) ;
%let b=%sysfunc(putn(&a_SASdate.,yymmn6.)) ;
%let et=%sysfunc(intnx(month,%sysfunc(inputn(&date.,yymmdd10.)),2,s),yymmn6.);
%put  &a_SASdate. &b. &et.;

Я написал ниже код для создания макропеременной для каждой даты.

data new;
do i=1 to 12;
call symput('mon'||put(i,z2.),put(intnx('month',&et.,i),yymmn6.));
a=symget('mon'||put(i,z2.));
output;
end;
run;

Ожидаемый результат

i   a
1   201704
2   201705
3   201706
4   201707
5   201708
6   201709
7   201710
8   201711
9   201712
10  201801
11  201801
12  201803

Но я получаю

1   251204
2   251205
3   251206
4   251207
5   251208
6   251209
7   251210
8   251211
9   251212
10  251301
11  251302
12  251303

Что пошло не так?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Когда & et был преобразован в 201703, который не является датой SAS, поэтому, основываясь на неправильной дате, intnx ('month', & et., I) дал вам неверные результаты. Таким образом, вы должны сначала преобразовать & et в дату SAS. Кроме того, вы просто хотите определить переменную, вам не нужно несколько макропеременных.

data new;
do i=1 to 12;
call symput('a',put(intnx('month',input("&et",yymmn6.),i),yymmn6.));
a=symget('a');
output;
end;
run;
0 голосов
/ 07 мая 2018

Таким образом, вы хотите иметь год и месяц на следующие 12 месяцев от начала определенной даты. Я придумал немного более компактное решение:

%let date= '1jan17'd; /*Begin date*/

data wanted; 
    do i=1 to 12;
        a=intnx('month',&date.,i); /*increment by single month from begin date*/
        a=put(a, yymmn6.); /*This formats the date to wanted. */
        output;
    end;
run;

Для получения дополнительной информации о соответствующих функциях IntNx и ГГММxw. Формат

...