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