intnx関数について基本の話

前回、intck関数とintervaldsのコンボを紹介したので、次はintnx関数とintervaldsのコンボをやろうと思うのですが、まずintnx関数を使ったことない方も多いと思うので、基本を紹介します。

以下のデータセットがあったとします。

data Q1;
X=input('2013/04/05',yymmdd10.);output;
X=input('2013/01/31',yymmdd10.);output;
X=input('2014/06/14',yymmdd10.);output;
format X: NLDATEW30.;
run;







さて、次のコードを実行すると

data A1;
set Q1;
X_1=intnx('year',X,1);
X_2=intnx('month',X,1);
X_3=intnx('week',X,1);
format X: NLDATEW30.;
run;






はい、もうピンときたと思いますが、これintck関数の逆の働きをするんです。
intck関数が時点Aから時点Bまでチェックポイント単位Cで見た時、ちょうどD単位分跨いだ。のDを求めるのに対して

intnx関数は時点Aからチェックポイント単位CでD単位分跨いだら時点Bになった。のBを求める関数です。

なのでX_1=intnx('year',X,1);は年単位で、1単位分跨いだ時点です。年のチェックポイントは1月1日なので、全部、翌年の1月1日になっています。

同様にX_2=intnx('month',X,1);は、翌月の1日になってます。

X_3=intnx('week',X,1);はちょっとわかりにくいですが、日曜日がチェックポイントなので、直後の日曜日となります。

続いて

data A2;
set Q1;
X_1=intnx('year',X,1,'sameday');
X_2=intnx('month',X,1,'sameday');
X_3=intnx('week',X,1,'sameday');
format X: NLDATEW30.;
run;






samedayオプションをつけたことで、1単位分跨いだ後の同日時点という意味になります。
すなわち
X_1=intnx('year',X,1,'sameday');は1年後の同月同日となり
X_2=intnx('month',X,1,'sameday');は1月後の同日(1月31日の1月後の同日が2/28になっていることに留意)
X_3=intnx('week',X,1,'sameday');は、次週の同曜日です。

また、endを使うと

data A3;
set Q1;
X_1=intnx('year',X,1,'end');
X_2=intnx('month',X,1,'end');
X_3=intnx('week',X,1,'end');
format X: NLDATEW30.;
run;






もうこれは説明いらないですね。1単位分跨いだ後の末時点。或いは2単位分跨いじゃう直前部分とも言い換えれるでしょう。


次は、よりマニアックに

data A4;
set Q1;
X_1=intnx('year1.6',X,1);
X_2=intnx('week1.2',X,1);
format X: NLDATEW30.;
run;






これはちょっと誤解しやすいところですが、1単位分跨いだ後の、小数点分下位単位をまたいだ日付です。

X_1=intnx('year1.6',X,1);は1年後の6月です(1年6ヶ月後じゃないことに要注意!!)
全部6月になりますからね!!year1.5は1年後の5月であって、0.5を半年とかって風に比で考えてはだめです!
X_2=intnx('week1.2',X,1);は1週後の月曜日です。日曜日が0.1だから月曜は0.2ね!

はい、負の値をとって、逆上った日付もとれます

data A5;
set Q1;
X_1=intnx('year',X,-1,'sameday');
X_2=intnx('month',X,-1,'sameday');
X_3=intnx('week',X,-1,'sameday');
format X: NLDATEW30.;
run;






samedayやendの他にmiddleやbeginもあるのですが、読んで字のごとくなので割愛します。









0 件のコメント:

コメントを投稿