7

日時 (dd/mm/yyyy hh:mm) を読み取るための適切な SAS 情報についてアドバイスできますか ???

例えば

data _null_;
informat from_dt datetime????.;
input from_dt ;
put from_dt=;
cards;
01/01/1960 00:00
;run;
4

5 に答える 5

9

通常、入力形式の anydt* ファミリは機能します。

data _null_;
  from_dt = input("01/01/1960 00:00", anydtdtm.);
  put from_dt= :datetime20.;
run;
/* on log
from_dt=01JAN1960:00:00:00
*/
于 2009-09-09T13:58:49.017 に答える
8

特定の情報が組み込まれているとは思いませんが、独自に展開するのは比較的簡単です。以下は、カスタムの日時入力形式 (これには cntlin データ セットが必要です) と、特定の日時を読み取り、入力と同じように見えるように元の形式に戻すカスタム形式 (picture ステートメントを使用) を作成する例です。時間部分は常に真夜中 (00:00) であると仮定して単純化しましたが、時間部分も追跡する必要がある場合は簡単に拡張できます (86400 の数値を 3600 に変更して 1 時間ごとに取得し、60毎分)。work.infmt データ セットを開いてどのように表示されるかを確認すると、何が起こっているかを確認するのに役立ちます。

/* Create a custom datetime format as Month/Day/Year<space>Hours:Minutes*/
proc format;
  picture mydt other='%0m/%0d/%0Y %0H:%0M' (datatype=datetime);
run;

/* Create a custom informat using the format above */
data infmt ;
retain fmtname "dtwithspace" type "I" ;
   do label = "1jan1960:00:00"dt to
              "2jan2059:00:00"dt by 86400 ; 
      start = trim(left(put(label,mydt.)));
      output ;
   end ;
run ;
proc format cntlin = infmt ;
run ;


/* Now apply the informat and format to the data */
data _null_;
input from_dt $ 1-20;
format from_dt2 mydt.;
from_dt2=input(from_dt, dtwithspace.);
put from_dt2=;
cards;
01/01/1960 00:00
01/02/1999 00:00
;
run;

これにより、次のような出力が得られました。

278  data _null_;
279  input from_dt $ 1-20;
280  format from_dt2 mydt.;
281  from_dt2=input(from_dt, dtwithspace.);
282  put from_dt2=;
283  cards;

from_dt2=01/01/1960 00:00
from_dt2=01/02/1999 00:00
于 2009-09-08T02:25:24.147 に答える
5

SAS は、データの特定の日時形式をサポートしていない可能性があります。受信データを frendlier 形式に変換するか、substrDHMS および MDY関数を使用して日時を解析することができます。

data test;
    format dtstr $16. dt datetime22.4;
    dtstr='01/01/1960 00:00';
    day=substr(dtstr,1,2);
    month=substr(dtstr,4,2);
    year=substr(dtstr,7,4);
    hour=substr(dtstr,11,2);
    minute=substr(dtstr,15,2);
    dt=DHMS(MDY(1*month,1*day,1*year),1*hour,1*minute,0);
    output;
run;

または、datetime 文字列を datetimew.d 形式に変換し、書式設定された文字列を入力することもできます。

data test;
    format dtstr $16. dstr $8. tstr $5. indtstr $14. dt datetime22.4;
    dtstr='01/01/1960 00:00';
    dstr=put(input(substr(dtstr,1,10),mmddyy10.),date8.);
    tstr=substr(dtstr,12);
    indtstr=dstr!!':'!!tstr;
    dt=input(indtstr,datetime14.0);
    output;
run;

変換は 1 つの複雑なステートメントに圧縮できるため、このためのマクロを作成することをお勧めします。

于 2009-09-07T15:06:57.810 に答える
0

ここのリストを見ると、1つはないと思います。

で自分で作成できるproc formatと思いますが、それは非常に難しいと思います。VilleKoskinenの提案はおそらくあなたの最善の策です。

于 2009-09-07T23:47:03.400 に答える
0

SAS ナレッジベースのこのエントリには、datetime を解析およびフォーマットするためのコードが含まれています。SAS には優れたオンライン ヘルプ システムがあるようです。

このGoogle グループでのやり取りの 3 番目のメッセージも役立つかもしれません。日時の入力について説明し、コードを提供します。

あなたの質問は解読するのが非常に難しく、私は SAS についてほとんど知りません。それが役に立てば幸い。

于 2009-09-07T14:19:27.590 に答える