はじめての proc calendar - SAS

あまり使っている人を見たことがない proc calendar を使ってみます。

まずは簡単なカレンダーを作ってみる

options nocenter nodate nonumber ;

/* 予定名と、開始日、終了日を作成します */
data SCHEDULE ;
  length NAME $256. ;
  NAME = "TEST-A" ; DTSTART = '01MAY2015'd ; DTEND = '01MAY2015'd ; output ;
  NAME = "TEST-B" ; DTSTART = '14MAY2015'd ; DTEND = '15MAY2015'd ; output ;
  NAME = "TEST-C" ; DTSTART = '19MAY2015'd ; DTEND = '20MAY2015'd ; output ;
  NAME = "TEST-D" ; DTSTART = '18MAY2015'd ; DTEND = '21MAY2015'd ; output ;
  NAME = "TEST-E" ; DTSTART = '23MAY2015'd ; DTEND = '31MAY2015'd ; output ;
run ;
/* 開始日順に並べておく必要があります */
proc sort data=SCHEDULE ;
  by DTSTART ;
run ;

proc calendar data=SCHEDULE ;
  start DTSTART ; /* 開始日 */
  fin   DTEND ;   /* 終了日 */
  var   NAME ;    /* 予定名 */
run ;


祝日一覧を追加する

予定だけでなく、祝日も追加してみましょう。

せっかくなので、祝日はテキトーな祝日ではなく、Google先生が提供している祝日一覧(.icsファイル)を使ってみます。filename url を使用して取得します。

取得先アドレス:
http://www.google.com/calendar/ical/japanese@holiday.calendar.google.com/public/basic.ics

ファイルからは、scanover オプションで覚えた @'character-string' カラムポインタコントロールを用いて、日付と祝日名を取得します。scanover は、 @'character-string' カラムポインタコントロールを使用していれば、指定しなくてもいいぽいですね。

日付は「DTSTART;VALUE=DATE:」の後にYYYYMMDD形式で、祝日名は「SUMMARY:」の後に記載されています。

filename ICS url "http://www.google.com/calendar/ical/japanese@holiday.calendar.google.com/public/basic.ics";

data HOLIDAY ;
  infile ICS recfm=V lrecl=1048576 dlm="0c"x ;
  input @'DTSTART;VALUE=DATE:' DTSTART : yymmdd8.
        @'SUMMARY:'            NAME    : $256.
        ;
  /* SAS日付だと、proc calendar実行時に WARNING が出てきて怒られたので、*/
  /* dhms関数を用いてSAS日時に変換します                                */
  DHMS = dhms(DTSTART, 0, 0, 0) ;
  /* 祝日はそれぞれ期間が 1日なので、期間を1日に設定します。 */
  DUR = 1 ;
run ;
proc sort data=HOLIDAY ;
  by DHMS ;
run ;

proc calendar data=SCHEDULE holidata=HOLIDAY ;
  start DTSTART ;
  fin   DTEND ;
  var   NAME ;
  holistart DHMS ;
  holidur   DUR ;  /* 期間は全て1日なので、祝日の終了日を設定する */
                   /* holifin DHMS ; でも同じ結果が得られます     */
  holivar   NAME ;
run ;

5月3日~6日にGWが追加されました。


カレンダーの横幅、縦幅を設定する

(探しても全然見つからなくて、一番苦労した機能です)

proc calendarには、横幅と縦幅を設定するオプションがありませんが、オプション ps, ls で幅を設定することができます。全体のサイズが変化するので、細かい調整が必要なのが難点です。

横幅、縦幅を MAX に設定してると、悲しいことになるのでお気をつけ下さい。

options ls=180 ps=50 ;

proc calendar data=SCHEDULE holidata=HOLIDAY ;
  start DTSTART ;
  fin   DTEND ;
  var   NAME ;
  holistart DHMS ;
  holidur   DUR ;
  holivar   NAME ;
run ;


カレンダーの罫線を設定する

罫線は、オプション formchar で設定できます。デフォルト値は、options formchar="|----|+|---+=|-/\<>*" ; です。それぞれの位置で、使用する罫線が異なります。今回は、スケジュールの期間を示す = の部分を # に変えてみます。

全角文字の罫線を使用したいところですが、全角文字は残念ながら使用できません。

options formchar="|----|+|---+#|-/\<>*" ;

proc calendar data=SCHEDULE holidata=HOLIDAY ;
  start DTSTART ;
  fin   DTEND ;
  var   NAME ;
  holistart DHMS ;
  holidur   DUR ;
  holivar   NAME ;
run ;


参考サイト

  1. Mac OSX の iCal や iOS iphone に祝日カレンダーを追加
  2. カラムポインタコントロールの利用法
  3. CALENDERプロシジャで有害事象発現カレンダーを作成する_proc calenderにもっと光を!! / データステップ100万回 SAS新手一生
  4. 日付値と時間値から、日時値を作る小技。 / SAS忘備録

コメント

このブログの人気の投稿

日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS

データセット(.sas7bdatファイル)の文字コードを取得したい - SAS

Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意