Lettura delle date nei dati
Questo modulo mostra come leggere le variabili data, usare le funzioni data e utilizzare i formati di visualizzazione delle date in SAS. Si presume che abbiate familiarità con le fasi di lettura dei dati in SAS e con le istruzioni di assegnazione per calcolare nuove variabili. Se qualcuno dei concetti è completamente nuovo, potreste voler dare un’occhiata a Per maggiori informazioni qui sotto per le indicazioni su altri moduli di apprendimento. Il file di dati utilizzato nel primo esempio è presentato di seguito.
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
Il programma seguente legge i dati e crea un file dati temporaneo chiamato date. Notate che le date vengono lette nel passo dati, e il formato data11. viene usato 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 del proc print è presentato qui sotto. Confrontate le date nei dati con i valori di bday. Notate che per John la data è il 1 gennaio 1960 e il valore di bday è 0. Questo perché le date sono memorizzate internamente in SAS come 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 noi comprendiamo dovreste formattare l’output. Noi usiamo il formato date9. per vedere le date nella forma ddmmmyyyy. Questo è specificato in una dichiarazione di formato.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Ecco l’output prodotto dall’istruzione proc print di cui sopra.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959
Guardiamo i seguenti dati. A prima vista sembra che le date siano così diverse da non poter essere lette. 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 questo formato in un passo 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 del processo precedente mostrano che tutte le date sono lette correttamente.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959
C’è una grande varietà di formati disponibili per la lettura delle date in SAS. Il seguente è 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
Considera i seguenti dati in cui l’ordine è mese, anno e giorno.
7 1948 11 1 1960 110 1970 1512 1971 10
Potete leggere questi dati con ogni porzione della data in una variabile separata come nel passo 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;
Nota la funzione mdy(mese,giorno,anno) nel passo dei dati. Questa funzione è usata per creare un valore di data dai singoli componenti. Il risultato della stampa del proc segue.
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
Considerate i seguenti dati, che sono gli stessi di cui sopra, eccetto che solo due cifre sono usate 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 del proc sono mostrati qui sotto.
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 superiori e dopo il quale vengono interpretati come 1999 e inferiori. L’anno limite di default differisce per le diverse versioni di SAS:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
La dichiarazione delle opzioni nel programma che segue cambia il valore dell’anno limite in 1920. Questo fa sì che gli anni a due cifre inferiori a 20 vengano letti come dopo l’anno 2000. L’esecuzione dello stesso programma darà quindi 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 del proc print sono mostrati sotto. La prima osservazione è ora letta come avvenuta nel 2018 invece che nel 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
Computazioni con date trascorse
Le variabili data di SAS rendono molto comode le computazioni che coinvolgono le date. Per esempio, per calcolare l’età di ognuno al 1° gennaio 2000 usa la seguente conversione nel passo dei dati.
age2000=(mdy(1,1,2000)-bday)/365.25 ;
Il programma con questo calcolo nel contesto segue.
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 del proc sono mostrati qui sotto. La variabile AGE2000 ora contiene l’età in anni al 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 funzioni utili per la data
Ci sono un certo numero di funzioni utili da usare con le variabili data. La seguente è una lista 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 dimostra 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 del proc sono mostrati qui sotto. 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 data, più comunemente date9. e mmddyy11.
- Le funzioni data possono essere usate per creare valori di data dai loro componenti (mdy(m,d,y)), e per estrarre i componenti da un valore di data (month(),day(), etc.).
- L’opzione yearcutoff può essere usata se si devono leggere anni a due cifre.
Problemi a cui prestare attenzione
- Le date sono mescolate all’interno di un campo in modo tale che nessun formato di data può leggerle. Soluzione: Leggere il campo come un campo di caratteri, testare la stringa e usare la funzione di input e il formato appropriato per leggere il valore nella variabile data.
- Non c’è nessun formato in grado di leggere la data. Soluzione: leggi la data come componenti e usa una funzione per produrre un valore di data.
- A volte l’impostazione predefinita per yearcutoff non è quella della versione del pacchetto menzionata sopra. Soluzione: per determinare l’impostazione corrente di yearcutoff basta eseguire un programma contenente
PROC OPTIONS OPTION=YEARCUTOFF; RUN;
Questo produrrà un output contenente il valore corrente di yearcutoff.