Cicli con Dati in Formato Data
Quello che voglio fare è un loop tra una data ed un'altra. Inoltre da ciascuna data voglio estrarre delle informazioni tipo mese e anno.
Le date che ho a disposizione sono del tipo mese-anno (04-2014, 05-2014.... ); in Stata esse sono rappresentate come dati in formato tm
e si presentano così:
2014m4
2014m5
2014m6
2014m7
2014m8
2014m9
2014m4 è solo la formattazione di un numero intero
. di `=tm(2014m4)'
651
dove 651 rappresenta il numero di mesi da gennaio 1960 ad aprile 2014. Dato che `=tm(2014m4)'
restituisce un numero intero posso fare un ciclo con forvalues
forvalues t = `=tm(2014m4)'/`=tm(2014m9)' {
dove t assumerà i valori 651, 652,...656.
Ora dal valore 651 voglio estrarre l'anno a cui appartiene (2014) e il mese dell'anno (aprile ovvero 4). Posso ottenere queste informazioni tramite le funzioni year()
e month()
che però hanno bisogno di dati in formato td()
. Analogamente al formato tm()
, il formato td()
è la rappresentazione di un numero intero che indica il numero di giorni a partire dal 01/01/1960. La funzione dofm()
consente di convertire un dato in formato tm()
nel corrispettivo in formato td()
.
. di dofm(651)
19814
ora posso estarrre l'informazione relativa all'anno e al mese così:
. di year(19814)
2014
. di month(19814)
4
Ecco il ciclo che riunisce tutto quello detto sopra
forvalues t = `=tm(2014m4)'/`=tm(2014m9)' {
**estrazione mese e anno
** I. conversione da mese dal t0 a giorno dal t0
local day0=dofm(`t')
** II. anno corrispondente al day0: NB la funzione year() lavora solo con dati in formato td
global Y = year(`day0')
** III. mese corrispondente al day0: NB la funzione month() lavora solo con dati in formato td
global M : display %02.0f month(`day0')
di "$Y - $M"
}
e lo stesso ciclo con trace attivato per capire cosa avviene riga per riga
. set trace on
. forvalues t = `=tm(2014m4)'/`=tm(2014m9)' {
2. **estrazione mese e anno
. ** I. conversione da mese dal t0 a giorno dal t0
. local day0=dofm(`t')
3. ** II. anno corrispondente al day0: NB la funzione year() lavora solo con dati in formato td
. global Y = year(`day0')
4. ** III. mese corrispondente al day0: NB la funzione month() lavora solo con dati in formato td
. global M : display %02.0f month(`day0')
5. di "$Y - $M"
6. }
- forvalues t = `=tm(2014m4)'/`=tm(2014m9)' {
= forvalues t = 651/656 {
- local day0=dofm(`t')
= local day0=dofm(651)
- global Y = year(`day0')
= global Y = year(19814)
- global M : display %02.0f month(`day0')
= global M : display %02.0f month(19814)
- di "$Y - $M"
= di "2014 - 04"
2014 - 04
- }
- local day0=dofm(`t')
= local day0=dofm(652)
- global Y = year(`day0')
= global Y = year(19844)
- global M : display %02.0f month(`day0')
= global M : display %02.0f month(19844)
- di "$Y - $M"
= di "2014 - 05"
2014 - 05
- }
- local day0=dofm(`t')
= local day0=dofm(653)
- global Y = year(`day0')
= global Y = year(19875)
- global M : display %02.0f month(`day0')
= global M : display %02.0f month(19875)
- di "$Y - $M"
= di "2014 - 06"
2014 - 06
- }
- local day0=dofm(`t')
= local day0=dofm(654)
- global Y = year(`day0')
= global Y = year(19905)
- global M : display %02.0f month(`day0')
= global M : display %02.0f month(19905)
- di "$Y - $M"
= di "2014 - 07"
2014 - 07
- }
- local day0=dofm(`t')
= local day0=dofm(655)
- global Y = year(`day0')
= global Y = year(19936)
- global M : display %02.0f month(`day0')
= global M : display %02.0f month(19936)
- di "$Y - $M"
= di "2014 - 08"
2014 - 08
- }
- local day0=dofm(`t')
= local day0=dofm(656)
- global Y = year(`day0')
= global Y = year(19967)
- global M : display %02.0f month(`day0')
= global M : display %02.0f month(19967)
- di "$Y - $M"
= di "2014 - 09"
2014 - 09
- }
.
. set trace off
bye bye