Truco

Manejo de fechas en Stata


Un problema que aparece de vez en cuando, es por ejemplo la disponibilidad de las habitaciones de un hotel (también podría ser camas de hospital, alquiler de vehículos y maquinarias, etc.) que son reservadas para un número de días por una persona y la administración desea conocer a final del mes el número de habitaciones que día a día fueron ocupadas.

Ejemplo:

clear
set more off
input ///
str30 date_in str30 date_out
"7/22/2011" "8/27/2011"
"8/27/2011" "8/27/2011"
"8/27/2011" "8/28/2011"
"8/28/2011" "8/28/2011"
"8/28/2011" "8/29/2011"
"8/27/2011" "8/28/2011"
"8/28/2011" "8/28/2011"
"8/28/2011" "8/28/2011"
"8/28/2011" "8/29/2011"
"8/31/2011" "8/31/2011"
"8/31/2011" "8/31/2011"
"8/31/2011" "9/4/2011"
"8/23/2011" "8/23/2011"
"8/23/2011" "8/24/2011"
"8/24/2011" "9/15/2011"
"8/4/2011" "8/4/2011"
"8/4/2011" "8/8/2011"
"8/10/2011" "8/10/2011"
"8/10/2011" "8/17/2011"
end
list

generate date_in1=date(date_in,"MDY") // see (1) below
generate date_out1=date(date_out,"MDY") // (1)
format date_in1 date_out1 %td // (2)
summarize date_in1 // (3)
local d1=r(min) // (3)
summarize date_out1 // (3)
local d2=r(max) // (3)
local range=`d2'-`d1' // (4)

forvalues i=0/`range' { // (5)
local kk=`d1'+`i' // (6)
gen datea`kk'=1 if inrange(`d1'+`i', date_in1,date_out1) // (7)
label var datea`kk' `="`=day(`d1'+`i')'"+ "_"+ /// // (8)
"`=month(`d1'+`i')'"+ "_"+"`=year(`d1'+`i')'"'
}

generate id=_n // (9)
reshape long datea, i(id) j(datekk) string // (10)
collapse (sum) datea, by(datekk) // (11)
destring datekk, replace // (12)
format datekk %td
rename datea rooms_oc // (13)
label var rooms_oc "rooms occupied" // (14)
list, sep(0) // (15)

Revisión de lo anterior:

  1. Fechas: La variable ingresada como cadena será convertida a temporal transcurrida (número de días a partir de un dato o fecha inicial)
  2. Las fechas se les asigna un formato.
  3. Las fechas mínimas y máximas son obtenidas a partir del comando summarize y son guardados en macros locales.
  4. El rango se calcula y se guarda en una macro local
  5. Usando el comando forvalueslos días del rango son conectados por un loop (bucle).
  6. La fecha, en días transcurridos es calculada
  7. Una nueva variable para cada día es calculada y se incluye el valor de 1 en la observación donde el bucle se encuentra dentro del rango indicado por la función inrange().
  8. La nueva variable creada se le da una etiqueta, que es la fecha del bucle.
  9. Genera una variable identificador que será utilizado en el comando reshape.
  10. Reestructurar los datos de formato ancho a formato largo por medio del comando reshape.
  11. Contraer los datos para obtener los resultados requeridos por medio del comando collapse.
  12. Utilice el comando destring para convertir una variable de cadena a una variable numérica.
  13. Cambiar el nombre de variable.
  14. incluyen una etiqueta a la variable.
  15. Finalmente, lista de los resultados.

Para ayuda sobre un comando escriba:
help

y por ejemplo, para los comandos
help input
helpgenerate
helpsummarize


Los resultados guardados desde el comando summarize pueden ser observado escribiendo: returnlist después del comando summarize.
help macro
help forvalues
help collapse
help destring
help rename
help label
help list

¡Guarda esta información!

Descargalo en PDF

Descargar

¡Comparte este evento con tus colegas!

Email

Enviar

WhatsApp

Facebook

Cotizar
Próximos
Eventos

X

Mis cotizaciones:

Comentarios a tu solicitud:

Cotizar