intnx関数とintervaldsオプションである日付の前後に発生するイベント日を取得する

例えば、何かの祝日で、普段であれば平日の曜日に休みがあったりすると、この休みが終わったら次の祝日はなんだっけ?来月は祝日あったっけ?とか考えたりすることってあると思います。

data Q1;
X=input('2014/03/05',yymmdd10.);output;
X=input('2014/04/29',yymmdd10.);output;
X=input('2014/07/14',yymmdd10.);output;
format X: NLDATEW30.;
run;







のように、ある日付が与えられた時に、その日から見て、直前にあった祝日と、直後にある祝日の日付を取得せよという問題があったとします。

まず、米国の祝日であればholiday関数とかでeaster = holiday('easter', 2014);とかすれば、その年の祝日の日付を取得できますが、日本の祝日には対応してません。

fcmpプロシジャやマクロで日本用のholiday関数を誰かが作ってくれれば有り難いのですが、今回は手抜きで

data EVENT;
begin=input('2014年01月13日 月曜日',NLDATEW30.);output;
begin=input('2014年02月11日 火曜日',NLDATEW30.);output;
begin=input('2014年03月21日 金曜日',NLDATEW30.);output;
begin=input('2014年04月29日 火曜日',NLDATEW30.);output;
begin=input('2014年05月05日 月曜日',NLDATEW30.);output;
begin=input('2014年07月21日 月曜日',NLDATEW30.);output;
begin=input('2014年09月15日 月曜日',NLDATEW30.);output;
begin=input('2014年09月23日 火曜日',NLDATEW30.);output;
begin=input('2014年10月13日 月曜日',NLDATEW30.);output;
begin=input('2014年11月03日 月曜日',NLDATEW30.);output;
begin=input('2014年11月24日 月曜日',NLDATEW30.);output;
begin=input('2014年12月23日 火曜日',NLDATEW30.);output;
format begin NLDATEW30.;
run;
















のように2014年において、月曜日から金曜日が祝日または振替で休みとなる日付がデータとして与えられたとしましょう。


そうすると以下の様なプログラムが成立します。(後でコメントみてください!)

options intervalds=(event=EVENT);
data A1;
 set Q1;
 NEXT_HOLI=intnx('event',X,1);
 PRE_HOLI=intnx('event',X-1,-1,'end')+1;
 format NEXT_HOLI PRE_HOLI NLDATEW30.;
run;






おそらくintervaldsオプションについて書いた以前の記事と

intnx関数の記事をみていただければ


理屈がわかるかと思います。

ただ、直前の祝日といったように逆向きに負の値でまたぎをとるのはちょっと頭を悩まします。
上記の書き方で本当に正解なのか?あるいは最善の書き方なのかはちょっと自信ないです。
どなたかご教示ください。

なんで上記のような書き方にしているかについては、'end'を外したらり、-1をとったり、+1をとったりして試して、実感してください。

追記>>コメントに正解の書き方をいただいたので、見てください!!



(以下、いつもの、誰も喜ばないおまけ)

さて、電王戦タッグマッチはSAS忘備録のa matsuさんと見に行くことになりましたが、他にも会場にいらっしゃるSASユーザーの方がいればぜひ教えてください。

あぁ、それにしても昨日の王位戦は、、。木村一基八段を応援していたので、辛かったです。
羽生さんはもう、ほんと強いですね、人間とは思えない。

木村一基を知らないという方は「木村一基 ぼやき」とかで、動画を見ていただければ、その人間元的魅力の一端がわかるんじゃないかと思います。

木村先生は名言が多いのですが
「負けと知りつつ、目を覆うような手を指して頑張ることは結構辛く、抵抗がある。でも、その気持ちをなくしてしまったら、きっと坂道を転げ落ちるかのように、転落していくんだろう。」(将棋世界2007年5月号)
なんかは、自分的に不本意な、美しくないと自覚しているプログラムを書いている時に、気持ちを奮いたたせるためによく思い浮かんだりします。


2 件のコメント:

  1. こんにちは。
    直前の祝日の部分、

    PRE_HOLI=intnx('event',X-1,0);

    といった感じで、インターバルを0にするといけそうです。たぶん。

    返信削除
    返信
    1. どうもです!
      あ~そっか!!しまったなぁ!!

      0使えるんだった!うっかりしてました!
      有難うございます!!

      削除