以下のデータセットがあったとします。
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 件のコメント:
コメントを投稿