2009-09-07 50 views
7

任何人都可以建議在日期時間(dd/mm/yyyy hh:mm)中讀取適當的SAS信息?sas informat datetime

例如

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

回答

8

我不認爲特定的信息是內置的,但它比較容易推出自己的。下面是創建自定義日期時間信息(這需要一個cntlin數據集)和自定義格式(使用圖片語句)的示例,該格式讀取您的特定日期時間,然後將其格式化爲與輸入相同的格式。我通過假設時間部分總是午夜(00:00)進行了簡化,但如果您需要跟蹤時間部分,則它可以很容易地擴展(只需將86400號碼更改爲3600即可獲得每小時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 
0

This entrySAS knowledgebase包括用於解析和格式化日期時間代碼。看起來SAS有一個很棒的在線幫助系統。

this exchange on Google groups中的第三條消息也可能有幫助。它討論輸入日期時間並提供代碼。

你的問題很難破譯,而且我對SAS的知識知之甚少,這就是我所能提供的一切。希望能幫助到你。

5

SAS可能不支持特定日期時間格式的數據是你既可以嘗試將輸入數據轉換爲frendlier格式,或者你可以使用substrDHMS and 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; 

或者你也可以在時間字符串轉換成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; 

轉換可以被壓縮到一個單一的,而是複雜的語句,因此創建此宏可能是一個很好的決定。

0

按照列表here,我不認爲有一個。

可以想象,你可以用proc format創建自己的,但我認爲這將是非常困難的。 Ville Koskinen的建議可能是你最好的選擇。

8

的anydt *系列informats的做的工作,平時。

data _null_; 
    from_dt = input("01/01/1960 00:00", anydtdtm.); 
    put from_dt= :datetime20.; 
run; 
/* on log 
from_dt=01JAN1960:00:00:00 
*/ 
+0

不錯 - 我以前沒有見過這樣的信息。 – cmjohns 2009-09-09 14:40:11

+0

如果有人正在嘗試此操作,並且對月份和日期的解釋不正確,請嘗試通過在上述示例之前運行'options datestyle = dmy;'來更新datestyle – 2015-09-16 13:30:45