2018年3月23日金曜日

PROC FORMAT入門6 : PICTUREステートメント





PICTUREステートメントの「DATATYPE=オプション」を使うと、日付・時刻・日時データに対して、好きな書式への読み替え・変換をすることが出来ます。






構文

 PROC FORMAT;

      PICTURE フォーマット名
             =  '書式の定義 (DATATYPE = データのタイプ)
             =  '書式の定義'  (DATATYPE = データのタイプ)
           ・・・
      ;
 RUN;


・ フォーマット名の末尾は数字NG(例えば「TEST1」など)

・ フォーマットをあてる対象の変数が、日付(DATE)・時刻(TIME)・日時(DATETIME)のどれなのかを DATATYPE=オプションに指定。

・間違ったDATATYPEを指定すると正しく変換・読み替えが出来ないので注意。
(例えば対象の変数が日付値なのに、DATATYPE=DATETIMEを指定するなど)

・詳しい書き方は以下の例で解説






以下をご覧ください。(いきなり見ても何のことやらって感じだと思いますが)

* フォーマット作成 ;
proc format;
   picture mydatetm (default=10)
      low - high = '%Y_%0m_%0d' (datatype=datetime)
   ;
run;

* フォーマットを変数に割り当てる ;
data TEST;
   format X mydatetm10.;
   X = '14mar2018:21:5:14'dt;
run;

 X 
  2018_03_14   


「datatype=datetime」としているので、日時値の変数に対するフォーマットを作成しています。

書式を定義する部分(青字箇所)に、やたら「%」が書かれてますね。
この「%なんちゃら」の部分を「ディレクティブ」と呼びます。

このディレクティブの組み合わせによって書式を定義しています。
以下、個人的に利用頻度の高いディレクティブを一覧にしました。



ディレクティブ(一部)

 ディレクティブ 設定内容 対応するDATATYPE 注意事項
%y

年(2桁)。
%0yとすると年が1桁の時に先頭に0が埋められる
date,
datetime

%Y年(4桁)date,
datetime


%m月。
%0mとすると月が1桁の時に先頭に0が埋められる
date,
datetime


%d日。
%0dとすると日が1桁の時に先頭に0が埋められる
date,
datetime


%H時(24時間表記)。
%0Hとすると時間が1桁の時に先頭に0が埋められる
time,
datetime 


%I時(12時間表記)。
%0Iとすると時間が1桁の時に先頭に0が埋められる
time,
datetime

%I←大文字のアイです
%M分。
%0Mとすると分が1桁の時に先頭に0が埋められる
time,
datetime


%p午前(AM) or 午後(PM)time,
datetime
SASの言語設定によって結果が変わる
(記事下方の注意事項を参照)
%S秒。
%0Sとすると秒が1桁の時に先頭に0が埋められる
time,
datetime


・・・など


例えば、書式を「%Y年%0m月%0d日」と定義したフォーマットを日付値に割り当てた場合、「2018年03月14日」みたいな感じで表示されます。


・ディレクティブには「%y」と「%Y」のように小文字・大文字の区別があるので注意
・他にも曜日や月名、週数などを設定するディレクティブもあります。あわせてマニュアルもご覧ください。




注意事項


注意①
PROC FORMAT入門の記事で何回も言ってる気がしますが、「DEFAULT=オプション」をつけないと文字切れしちゃうケースがあるのでご注意を!
(理由は以下で紹介している落とし穴と同じ。)

INFORMATの落とし穴【デフォルト長】


注意②
SASの言語設定によっては、結果が変わるディレクティブがあります。
以下をご覧ください。

* フォーマット作成 ;
proc format;
   picture mytime (default=10)
      low - high = '%p%0I:%0M' (datatype=time)
   ;
run;

* フォーマットを変数に割り当てる ;
data TEST;
   format X mytime10.;
   X = '21:05't;
run;

結果
SASの環境が「日本語」の場合
 X 
           午後09:05  

SASの環境が「英語」の場合
 X 
             PM09:05  


ディレクティブ「%p」はSASの言語設定によって結果が変わります。

日本語設定の場合は「午前 or 午後」で表示され、英語設定の場合は「AM or PM」で表示されます。


英語設定にあわせたい場合は、以下のように「LANGUAGE=ENGLISH」と指定します。

* フォーマット作成 ;
proc format;
   picture mytime (default=10)
      low - high = '%p%0I:%0M' (datatype=time language=english)
   ;
run;

ちなみに、LANGUAGE=オプションは現状一部の言語にしか対応してません。
(日本語とか中国語とかには設定できない。なんでだ・・・)





PROC FORMAT入門 : 記事一覧


0 件のコメント:

コメントを投稿