Utilizzo dei moduli di apprendimento dates / SAS
Lettura delle date in data
Questo modulo mostrerà come leggere le variabili di data, utilizzare le funzioni di data e utilizzare i formati di visualizzazione della data in SAS. Si presume che si abbia familiarità con i passaggi dei dati per la lettura dei dati in SAS e le istruzioni di assegnazione per il calcolo di nuove variabili. Se uno qualsiasi dei concetti sono completamente nuovi, si consiglia di guardare Per ulteriori informazioni di seguito per le indicazioni per altri moduli di apprendimento. Il file di dati utilizzato nel primo esempio viene presentato di seguito.
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
Il programma sottostante legge i dati e crea un file di dati temporaneo chiamato date. Si noti che le date vengono lette nel passaggio dati e nel formato date11. viene utilizzato per leggere la data.
DATA dates; INPUT name $ 1-4 @6 bday date11.;CARDS;John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959;RUN;PROC PRINT DATA=dates;RUN;
L’output della stampa proc è presentato di seguito. Confronta le date nei dati con i valori di bday. Si noti che per John la data è 1 Jan 1960 e il valore per bday è 0. Questo perché le date sono memorizzate internamente in SAS come il numero di giorni dal 1 gennaio 1960. Poiché Mary è nata prima del 1960 il valore di bday per lei è negativo (-1635).
OBS NAME BDAY 1 John 0 2 Mary -1635 3 Kate 1046 4 Mark -207
Per vedere le date in un modo che comprendiamo dovresti formattare l’output. Usiamo il date9. formato per vedere le date nel modulo ddmmmyyyy. Questo è specificato in un’istruzione format.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Ecco l’output prodotto dall’istruzione proc print sopra riportata.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959
Diamo un’occhiata ai seguenti dati. A prima vista sembra che le date sono così diversi che non potevano essere letti. Hanno due cose in comune:
1) hanno tutti mesi numerici,
2) sono tutti ordinati mese, giorno e poi anno.John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959
Queste date possono essere lette con lo stesso formato, mmddyy11. Segue un esempio dell’uso di tale formato in una fase di dati.
DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.;CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
I risultati della stampa proc sopra riportata mostrano che tutte le date sono state lette correttamente.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959
È disponibile un’ampia varietà di formati per l’uso nelle date di lettura in SAS. Di seguito è riportato un esempio di alcuni di questi formati.
Informat Description Range Width Sample-------- ----------- ----- ------- ------JULIANw. Julian date 5-32 5 65001 YYDDDDDMMYYw. date values 6-32 6 14/8/1963MONYYw. month and year 5-32 5 JUN64YYMMDDw. date values 6-32 8 65/4/29YYQw. year and quarter 4-32 4 65Q1
Considerare i seguenti dati in cui l’ordine è mese, anno e giorno.
7 1948 11 1 1960 110 1970 1512 1971 10
È possibile leggere questi dati con ciascuna porzione della data in una variabile separata come nel passaggio dati che segue.
DATA dates; INPUT month 1-2 year 4-7 day 9-10; bday=MDY(month,day,year);CARDS; 7 1948 11 1 1960 110 1970 1512 1971 10;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Notare la funzione mdy(mese,giorno,anno) nel passaggio dati. Questa funzione viene utilizzata per creare un valore di data dai singoli componenti. Segue il risultato della stampa proc.
OBS MONTH YEAR DAY BDAY 1 7 1948 11 11JUL1948 2 1 1960 1 01JAN1960 3 10 1970 15 15OCT1970 4 12 1971 10 10DEC1971
Date a due cifre
Considera i seguenti dati, che sono gli stessi di cui sopra, tranne che solo due cifre vengono utilizzate per indicare l’anno e l’anno appare per ultimo.
7 11 18 7 11 48 1 1 6010 15 7012 10 71
La lettura dei dati è la stessa che abbiamo appena fatto.
DATA dates; INPUT month day year ; bday=MDY(month,day,year);CARDS; 7 11 18 7 11 48 1 1 6010 15 7012 10 71;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
I risultati della stampa proc sono mostrati di seguito.
OBS MONTH DAY YEAR BDAY 1 7 11 18 11JUL1918 2 7 11 48 11JUL1948 3 1 1 60 01JAN1960 4 10 15 70 15OCT1970 5 12 10 71 10DEC1971
Gli anni a due cifre funzionano qui perché SAS assume un cutoff (yearcutoff) prima del quale gli anni a due cifre vengono interpretati come l’anno 2000 e successivo e dopo di che vengono interpretati come 1999 e successivi. L’yearcutoff predefinito differisce per le diverse versioni di SAS:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
L’istruzione options nel programma che segue modifica il valore yearcutoff a 1920. Ciò fa sì che negli anni a due cifre inferiori a 20 vengano letti come dopo l’anno 2000. L’esecuzione dello stesso programma produrrà risultati diversi quando questa opzione è impostata.
OPTIONS YEARCUTOFF=1920;DATA dates; INPUT month day year ; bday=MDY(month,day,year);CARDS; 7 11 18 7 11 48 1 1 6010 15 7012 10 71;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
I risultati della stampa proc sono mostrati di seguito. La prima osservazione è ora letto come si verificano in 2018 invece di 1918.
OBS MONTH DAY YEAR BDAY 1 7 11 18 11JUL2018 2 7 11 48 11JUL1948 3 1 1 60 01JAN1960 4 10 15 70 15OCT1970 5 12 10 71 10DEC1971
I calcoli con date trascorse
Le variabili di data SAS rendono molto convenienti i calcoli che coinvolgono date. Ad esempio, per calcolare l’età di tutti il 1 gennaio 2000 utilizzare la seguente conversione nel passaggio dati.
age2000=(mdy(1,1,2000)-bday)/365.25 ;
Segue il programma con questo calcolo nel contesto.
OPTIONS YEARCUTOFF=1900; /* sets the cutoff back to the default */DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.; age2000 = (MDY(1,1,2000)-bday)/365.25 ;CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
I risultati della stampa proc sono mostrati di seguito. La variabile AGE2000 ora contiene l’età in anni a partire dal 1 ° gennaio 2000.
OBS NAME BDAY AGE2000 1 John 01JAN1960 40.0000 2 Mary 11JUL1955 44.4764 3 Joan 11JUL1955 44.4764 4 Kate 12NOV1962 37.1362 5 Mark 08JUN1959 40.5667
Altre utili funzioni di data
Ci sono una serie di funzioni utili da utilizzare con le variabili di data. Di seguito è riportato un elenco di alcune di queste funzioni.
Function Description Sample-------- --------------------- -----------------month() Extracts Month m=MONTH(bday);day() Extracts Day d=DAY(bday) ;year() Extracts Year y=YEAR(bday);weekday() Extracts Day of Week wk_d=WEEKDAY(bday);qtr() Extracts Quarter q=QTR(bday);
Il seguente programma mostra l’uso di queste funzioni.
DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.; m=MONTH(bday); d=DAY(bday) ; y=YEAR(bday); wk_d=WEEKDAY(bday); q=QTR(bday);CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; VAR bday m d y; FORMAT bday date9. ;RUN;PROC PRINT DATA=dates; VAR bday wk_d q; FORMAT bday date9. ;RUN;
I risultati della stampa proc sono mostrati di seguito. Le nuove variabili contengono il mese, il giorno, l’anno, il giorno della settimana e il trimestre.
OBS BDAY M D Y 1 01JAN1960 1 1 1960 2 11JUL1955 7 11 1955 3 11JUL1955 7 11 1955 4 12NOV1962 11 12 1962 5 08JUN1959 6 8 1959OBS BDAY WK_D Q 1 01JAN1960 6 1 2 11JUL1955 2 3 3 11JUL1955 2 3 4 12NOV1962 2 4 5 08JUN1959 2 2
Sommario
- Le date vengono lette con i formati di data, più comunemente date9. e mmddyy11.
- Le funzioni di data possono essere utilizzate per creare valori di data dai loro componenti (mdy(m,d,y)) e per estrarre i componenti da un valore di data (month (), day (), ecc.).
- L’opzione yearcutoff può essere utilizzata se devi leggere anni a due cifre.
I problemi da cercare
- Le date sono mescolate all’interno di un campo in modo tale che nessun singolo formato di data possa leggerle. Soluzione: leggere il campo come un campo di caratteri, testare la stringa e utilizzare la funzione di input e il formato appropriato per leggere il valore nella variabile data.
- Non esiste un formato in grado di leggere la data. Soluzione: leggere la data come componenti e utilizzare una funzione per produrre un valore di data.
- A volte l’impostazione predefinita per yearcutoff non è l’impostazione predefinita per la versione del pacchetto menzionato sopra. Soluzione: per determinare l’impostazione corrente per yearcutoff è sufficiente eseguire un programma contenente
OPZIONI PROC OPTION=YEARCUTOFF; RUN;
Questo si tradurrà in output contenente il valore corrente di yearcutoff.