La gestione di “date e orari” – 1° parte

In un post precedente abbiamo introdotto la differenza tra variabili di tipo numerico e variabili di tipo alfanumerico evidenziando come, per SAS, esistano solo ed esclusivamente questi due tipi di dati.

D’altra parte, nel mondo reale, esiste anche un’altra importante categoria di dati, quella riferita alla dimensione temporale, che necessita di essere gestita. Come fare dunque? SAS è in grado di trattare questo genere di informazioni?

Ovviamente la risposta è : Sì!

Vediamo come.

Le variabili date in SAS

SAS System ha reso conciliabile l’apparente contraddizione tra l’esistenza di due soli datatype  (numerico e alfanumerico) e la necessità di gestire informazioni temporali considerando queste ultime come “particolari tipologie” di dati numerici e applicando ad essi specifici formati di decodifica per renderli interpretabili come date (o orari).

Provo a spiegarmi meglio.

Per il momento, tralasciamo il discorso sugli orari e rimaniamo nell’ambito delle date: per SAS, qualsiasi numero intero – positivo o negativo – (o per meglio dire, la sua parte intera, positiva  o negativa) può essere interpretato, applicando alla variabile un opportuno formato di decodifica, come il numero di giorni trascorsi dal 1 Gennaio 1960.

Quindi, ad esempio:

-1 31/12/1959
0 1/1/1960
1 2/1/1960
10 11/1/1960
456 1/4/1961
12.834 20/2/1995

Ok, so cosa stai pensando: carino il “trucchetto” di considerare i numeri come “giorni trascorsi”…ma chi ha voglia di mettersi lì a contare ogni volta quanti giorni sono passati dal capodanno del 1960?

Domanda legittima, ma non c’è da sconfortarsi :-)…vediamo come SAS risolve il “problema” in modo semplicissimo.

Supponiamo di avere a che fare con questo piccolo dataset contenente una serie di numeri:

numeri

Ora, sottomettiamo questo semplice passo di data, tramite cui viene fatta una “copia” della variabile numero alla quale viene poi “applicato” il formato ddmmyy10:

data numeri_giorni;
   set numeri;

   /* Creo una copia della variabile 'numero' e applico 
     il formato ddmmyy10. per "leggerla" come data */
   giorno = numero;
   format giorno ddmmyy10.;

run;

questo è il risultato:

numeri_giorni

Come vedi, la variabile giorno che, ti ricordo, non è altro che una banale copia della variabile numero, appare codificata come una data.

Applicando il formato ddmmyy10. il numero “sottostante” viene interpretato da SAS come il numero di giorni trascorsi dal 1 Gennaio 1960. La variabile giorno rimane “numerica”, ma l’applicazione del formato la rende “leggibile” come data.

Se ci fai caso, i numeri negativi sono rappresentati come date antecedenti il 1 Gennaio 1960. Inoltre del numero decimale 129.84, è considerata solo la parte intera.

Semplice, no?

In SAS, sono disponibili numerosi formati “data”, grazie ai quali possiamo soddisfare tutte le nostre esigenze di visualizzazione di informazioni temporali. Ad esempio, la data “10 febbraio 2010” corrisponde al numero 18.303 e può essere visualizzata in diversi modi a seconda del formato applicato:

ddmmyy8. 10/02/10
ddmmyy10. 10/02/2010
ddmmyyb10. 10 02 2010
ddmmyyc10. 10:02:2010
ddmmyyd10. 10-02-2010
ddmmyyp10. 10.02.2010
ddmmyys10. 10/02/2010
date7. 10FEB10
date9. 10FEB2010
weekday. 4
downame. Wednesday
weekdate. Wednesday, February 10, 2010
worddate. February 10, 2010
ITAdfWDX. 10 Febbraio 2010

Tutto chiaro? Spero di sì, ma a questo punto potresti chiederti: “Ok, va bene le date, ma come faccio a gestire gli orari?”.

Bene, la soluzione che SAS mette a disposizione è del tutto analoga a quella per la gestione delle date.

Le variabili time in SAS

Analogamente alle variabili “data” e nel rispetto del principio secondo cui, per SAS, esistono solo due tipi datatype, qualsiasi numero positivo o negativo può essere considerato come numero di secondi trascorsi dalla mezzanotte.

Riprendiamo lo stesso dataset che abbiamo utilizzato nell’esempio precedente, modifichiamo il passo di data per creare nuovamente una seconda variabile orario alla quale applichiamo, questa volta, uno dei formati di decodifica degli orari ed eseguiamo il codice:

data numeri_orari;
   set numeri;
  
   /* Creo una copia della variabile 'numero' e applico 
     il formato time10.2 per "leggerla" come orario */
   orario = numero;
   format orario time10.2;

run;

Questo è il risultato:

numeri_orari

In questo caso, la variabile orario, copia della variabile numero, appare codificata come orario considerando il numero “sottostante” come il numero di secondi trascorsi dalla mezzanotte.

Da notare che i numeri negativi sono indicati come “tempo mancante” alla mezzanotte, e che i numeri decimali vengono interpretati come “centesimi di secondo” (vd. ad esempio l’osservazione 6).

Analogamente a quanto avviene per le date, in SAS, sono disponibili numerosi formati per decodificare informazioni “orarie”. Vediamo qualche esempio:

NUMERO

57912.20

-57912.20

-28487.80 12.51

-76431.67

time12.

16:05:12

-16:05:12 -7:54:48 0:00:13

-21:13:52

time12.2

16:05:12.20

-16:05:12.20 -7:54:48.80 0:00:12.51

-21:13:51.67

hhmm10.

16:05

-16:05 -7:55 0:00

-21:14

hhmm10.2

16:05.20

-16:05.20 -7:54.80 0:00.21

-21:13.86

mmss10.

965:12

-965:12 -474:48 0:13

-1273:52

mmss12.2

965:12.20

-965:12.20 -474:47.80 0:12.51

-1273:51.67

hour12.

16

16 8 0

21

hour12.2

16.09

16.09 7.91 0.00

21.23

tod12.2

16:05:12.20

07:54:48.80 16:05:12.20 00:00:12.51

02:46:08.33

timeampm12.2

4:05:12.20 PM

7:54:47.80 AM 4:05:12.20 PM 12:00:12.51 AM

2:46:08.33 AM

Da notare che i formati timew.d e hhmmw.d riportano il “numero” di ore:minuti:secondi.centesimi trascorsi (o da trascorrere in caso di numero negativo) dalla mezzanotte (00:00:00.00). Invece, i formati todw.d (time-of-day) e timeampmw.d indicano l’orario a cui corrisponde il numero “sottostante”. Quindi, ad esempio, i numeri 57912.20 e -28487.80 corrispondono entrambi alle ore 16:05:12.20 (circa le 4 PM), il primo relativamente al giorno “corrente” (oggi), l’altro in relazione al giorno “precedente” (ieri) come si può notare vedendo come vengono rispettivamente codificati dal formato time12.2.

…to be continued

Per ora ci fermiamo qui. In un prossimo post, tratteremo le variabili “date-time” e introdurremo alcune funzioni che ci permetteranno di trattare al meglio questo tipo di informazioni.

Nel frattempo vi lascio questo articolo: SAS® Routines for Calendar and Clock Elements, utile lettura per chi necessiti di approfondire il tema della gestione della dimensione temporale in SAS.

Alla prossima 🙂

2 commenti

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...