2009-09-07 11 views
7

Czy każdy może poinformować o odpowiednim informatorze SAS, aby odczytać w datetime (dd/mm/rrrr gg: mm) ???sas informat datetime

np

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

Odpowiedz

8

Nie sądzę, że konkretny informat jest wbudowany, ale stosunkowo łatwo jest wykonać własne. Poniżej znajduje się przykład utworzenia niestandardowego datata informatycznego (wymaga to zbioru danych cntlin) i niestandardowego formatu (za pomocą instrukcji obrazkowej), który odczytuje dane w określonej dacie czasu, a następnie formatuje go z powrotem, aby wyglądał tak samo jak dane wejściowe. Uprościłem to, zakładając, że część czasu była zawsze północą (00:00), ale można ją łatwo rozszerzyć, jeśli chcesz również śledzić części czasu (wystarczy zmienić numer 86400 na 3600, aby uzyskać co godzinę, i 60 za każdą minutę). Pomaga zobaczyć, co się dzieje, jeśli otworzysz zestaw danych work.infmt, aby zobaczyć, jak to wygląda.

/* 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; 

To dało moc takiego:

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 entry z SAS knowledgebase zawiera kod przeznaczony do analizowania i formatowanie datetime. Wygląda na to, że SAS ma świetny system pomocy online.

Trzecia wiadomość pod numerem this exchange on Google groups również może być pomocna. Mówi o wprowadzaniu datetime i dostarcza kodu.

Twoje pytanie jest tak trudne do rozszyfrowania i niewiele wiem o SAS, to wszystko, co mogę zaoferować. Mam nadzieję, że to pomoże.

5

SAS nie obsługuje określony format datetime Twoje dane są w Można też spróbować przekształcić dane przychodzące do formatu frendlier czy można analizować datetime używając substr, DHMS and MDY funkcje:.

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; 

lub alternatywnie można przekonwertować ciąg datetime w formacie datetimew.d i wejście sformatowany ciąg:

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; 

konwersja może być skompresowany do jednego, lecz złożonym oświadczeniem, więc tworząc makro dla tego może być dobrą decyzją.

0

Przechodząc przez listę here, nie sądzę, że istnieje.

Niewykluczone, że można utworzyć własne z proc format, ale myślę, że byłoby to bardzo trudne. Sugestia Ville'a Koskinena jest prawdopodobnie najlepsza.

8

The anydt * rodzina informats zrobić pracę, zwykle.

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

Niezły - nie widziałem wcześniej tego informatora. – cmjohns

+0

Jeśli ktoś próbuje tego i ma problemy z nieprawidłowym interpretowaniem miesięcy i dat, spróbuj zaktualizować styl dat, uruchamiając 'options datestyle = dmy;' przed powyższym przykładem –