SASマクロ データ変換

【SAS】年月に1ヶ月ずつ加算してループさせる方法(+88、INTNX)

本記事では、年月を表すマクロ変数値を、
202207
202208
202209
・・・
・・・
202306
と、1ヶ月ずつ増加させる方法について解説します。

+88を加算する方法

以下は、YYYYMMのMM部分が12になったら、+88を加算して、YYYY部分を一つ繰り上げる方法です。

%macro loop_ym(start, end);

	%local ym;
	
	%do ym = &start. %to &end.;
		
		%put &ym.;
		
		%if %substr(&ym., 5, 2) = 12 %then %let ym = %eval(&ym. + 88);
		
	%end;

%mend loop_ym;

%loop_ym(202206, 202307);

12月のときに202212 + 88 = 202300になり、%DOステートメントの先頭に戻ってきたときに、増分値1がインデックス変数値に加算されるので、202301になりループを続けます。

上記では%DOステートメントの%BYを省略しているため、増分値は1になります。

上記を実行すると、以下の結果がログに出力されます。

202206
202207
202208
202209
202210
202211
202212
202301
202302
202303
202304
202305
202306
202307

 

INTNX関数を使用する方法

以下は年月の増分をINTNX関数で行う方法です。

%macro loop_ym(start, end);

	%local ym i;
	
	%let i = 0;
	%do %until(&ym. = &end.);
	
		%let ym = %sysfunc(putn(%sysfunc(intnx(month, %sysfunc(inputn(&start., yymmn6.)), &i.)), yymmn6.));

		%put &ym.;
		
		%let i = %eval(&i. + 1);
	%end;

%mend loop_ym;

%loop_ym(202206, 202307);

INTNX関数の第二引数は日付のシリアル値でなければならないので、INPUTN関数と入力形式YYMMN6.で年月をシリアル値に変換しています。

そして、INTNX関数で年月を増加させたあと、PUTN関数と出力形式YYMMN6.で、シリアル値から年月に戻しています。

上記を実行すると、以下の結果がログに出力されます。

202206
202207
202208
202209
202210
202211
202212
202301
202302
202303
202304
202305
202306
202307