日時 (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;
通常、入力形式の 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
*/
特定の情報が組み込まれているとは思いませんが、独自に展開するのは比較的簡単です。以下は、カスタムの日時入力形式 (これには 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
SAS は、データの特定の日時形式をサポートしていない可能性があります。受信データを frendlier 形式に変換するか、substr、DHMS および 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 つの複雑なステートメントに圧縮できるため、このためのマクロを作成することをお勧めします。
ここのリストを見ると、1つはないと思います。
で自分で作成できるproc format
と思いますが、それは非常に難しいと思います。VilleKoskinenの提案はおそらくあなたの最善の策です。
SAS ナレッジベースのこのエントリには、datetime を解析およびフォーマットするためのコードが含まれています。SAS には優れたオンライン ヘルプ システムがあるようです。
このGoogle グループでのやり取りの 3 番目のメッセージも役立つかもしれません。日時の入力について説明し、コードを提供します。
あなたの質問は解読するのが非常に難しく、私は SAS についてほとんど知りません。それが役に立てば幸い。