2024年6月1日土曜日

excel日付とsas日付の違いの話

excel日付とSAS日付はどちらも日付を数値にしたものですが、そういえばこの二つは開始日が違ったな…ということがありましたので、忘れないように記事にします。こんな事めったにないとは思いますが。

この上記のexcelは、1行目に変数ラベル、2行目の変数名、3行目に日付(excel日付)が格納されています。これをsasにimportすると以下のようになります。仮なので読み込む際にオプションのgetnamesをyesにしたとしています。

データとしてはexcel日付の列ですが、変数名がデータの値として格納されているので文字列として扱われた結果2024/5/2がexcel日付のまま45414として文字列になっています。ところで2024/5/2のsas日付は23498なのでこのまま日付を型変換すると2024/5/2になりません。45414は2084/5/3です。

11   data _null_ ;
12       a = '02may2024d'd ;
13       putlog a= ;
14   run ;

a=23498

excel日付は1が1900-1-1なのに対し、SAS日付は1が1960-1-2なので60年と1日の差があります。ちなみにSAS日付上での1960-1-1は0です。excel日付は1始まりですがSAS日付は0始まりということもこの時初めて知りました。

なのでexcel日付からSAS日付に変換する際には1900-1-1と1960-1-2の差分の(21915 + 1)をexcel日付側から引けば日付が一致します。以下の実行ログを見ると、引き算した後のEXDTには正しく2024-5-2が格納されていて、excelから読み込んだものをそのままformat当てたORGDTは2084-5-3となっています。

130
131  data _null_ ;
132      set sh1 ;
133
134      format EXDT  yymmdd10. ;
135      format ORGDT yymmdd10. ;
136
137      if _n_ = 2 then do ;
138          ORGDT = label ;
139          EXDT = label - (21915 + 1) ;
140
141          putlog ORGDT= EXDT= ;
142      end ;
143
144  run ;

NOTE: 以下の箇所で文字値を数値に変換しました。(行:カラム)

      138:17   139:16

ORGDT=2084-05-03 EXDT=2024-05-02

NOTE: データセットWORK.SH1から2オブザベーションを読み込みました。

NOTE: DATA ステートメント処理(合計処理時間):

      処理時間           0.00 秒

      CPU時間            0.00 秒

普段こんなことはほとんど起こらないのですが、読み込むexcelファイルの日付がexcel日付で入力されている+その列にexcel日付以外の文字列が存在することで今回のようなことが起こります。例えば今回のような1行目が変数ラベルで2行目が変数名になっていたりとか、SASで取り込む際には不要ですけどファイルの作成者名が上の方に入ってたりとか、で紛れ込んできます。読み込むexcelをきれいに加工してからSASにimportすれば良いのですが、あまりexcelに変に手を加えるのも憚られる時があるし…で難しいところです。

0 件のコメント:

コメントを投稿