2018年3月23日金曜日

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




PICTUREステートメントで日付・時刻・日時値に書式を設定する「DATATYPE=オプション」の説明をしていきます。



📝 前置き
  • PICTUREステートメント1」の前提知識が必須
  • 設定・環境で動きが変わりまくるので挙動確認が必須。一部注意点を最後に記載したのでそちらも要確認!




構文

 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;
   length X 8. Y $10.;
   X = '14mar2018:21:5:14'dt;
   Y = put(X,mydatetm.);
run;

 Y 
 2018_03_14 


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

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

ディレクティブの組み合わせによって書式を定義します。



ディレクティブ(一部)


※ オプションやディレクティブの組み合わせ、SASの環境・言語設定によって、動作しなかったり動きが変わるため要挙動確認!

ディレクティブ設定内容対応する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 
%M
%0Mとすると分が1桁の時に先頭に0が埋められる
time,
datetime
%S秒(秒の整数部分のみ対応)
%0Sとすると秒が1桁の時に先頭に0が埋められる
time,
datetime
%%例えば「100%」と表示するには「100%%」と指定date,
time,
datetime
・・・など


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


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




注意事項


注意①

以下記事の最後らへんで解説している通り、フォーマット適用後の文字の長さを考慮して「DEFAULT=オプション」も併用しないと、文字切れするケースがある。
PICTUREステートメント1

また、PICTUREフォーマットはデフォルト長などの長さに応じて、右詰めで適用されるので、
「    2018年03月14日」みたいに文字が右に詰められて左側に空白(半角スペース)が入る事があるのでそこんところもご留意下さい。



注意②

オプションやディレクティブの組み合わせ、SASの環境・言語設定など、様々な要素によって結果が変わります。
以下、SASの環境によって結果が変わる一例です。

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

* フォーマット変換 ;
data TEST;
   length X 8. Y $10.;
   X = '21:05't;
   Y = put(X,mytime.);
run;

結果
SASの環境が「日本語」の場合
 Y 
  午後9  

SASの環境が「英語」の場合
 Y 
      PM9  


ディレクティブ「%p」と「%I」は、以下の意味になります。
・%p: timeやdatetimeの時刻に対してAM/PMを出力
・%I(大文字のアイ): timeやdatetimeの時刻に対して「時(12時間表記)」を出力


上の例ではSASの環境によって結果が変わっています。
(日本語の場合は「午前 or 午後」、英語の場合は「AM or PM」が適用された)


英語の設定にあわせたい場合は、以下のように「LANGUAGE=ENGLISH」と指定します。
(この方法でも環境とか他の要素で結果が変わるかも)

proc format;
   picture mytime (default=8)
      low - high = '%p%I' (datatype=time language=english)
   ;
run;

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



注意③

欠損値に「DATATYPE=」を設定すると「ERROR」という文字が返ってきます。

proc format;
   picture mydatetm (default=10)
      . = '%Y_%0m_%0d' (datatype=datetime)
   ;
run;

data TEST;
   length X 8. Y $10.;
   X = .;
   Y = put(X,mydatetm.);
run;

 Y 
      ERROR 




PROC FORMAT入門 : 記事一覧

2. INVALUEステートメント
3. 範囲の指定

0 件のコメント:

コメントを投稿