En el presente cuaderno se muestra un ejemplo de como se pueden organizar series de tiempo de información hidrometeorológica de diversas vairables y estaciones organizada en multiples archivos. Como ejemplo se sigue la forma en la que el IDEAM provee la información cuando se le hacen solicitudes masivas de información.
Se inicia limpiando el espacio de trabajo, cargando los paquetes “xts” para el manejo de series temporales y “lubridate” para manejo de fechas.
rm(list = ls())
library(xts)
library(lubridate)
Se hace una lista de los archivos terminados en .data utilizando list.files, si los archivos se encuentran en subcarpetas se debe especificar recursive = T y se le dice que guarde los nombres completos. Los archivos listados contienen nombres siguiendo la formato ‘VVVV@CCCC.data’, donde VVVV corresponde a la variable y CCCC al codigo de la estación.
Para manejar estos nombres se pueden usar expresiones regulares, este tipo de expresiones se usa para manejar y dar formato a cadenas de caracteres en múltiples lenguajes de programación. Lo primero es obtener todas las variables de las cuales se recibió información. Para esto se debe cortar las cadenas de caracteres hasta despues del último ‘/’ y antes del signo ‘@’, esto se hace con la función sub; y se sacan los valores únicos de dicho proceso. En este ejemplo se tiene un total de 49 variables diferentes suministradas por el IDEAM.
directorio <- "D:/Documentos/Diego/02.Profesionales/UPJ/DATOS/"
ficheros <- list.files(paste0(directorio,"RADICADO"), ".data$", recursive = T, full.names = T)
head(ficheros)
## [1] "D:/Documentos/Diego/02.Profesionales/UPJ/DATOS/RADICADO/CP-CO-SP/BSHG_CON@23185010.data"
## [2] "D:/Documentos/Diego/02.Profesionales/UPJ/DATOS/RADICADO/CP-CO-SP/BSHG_CON@23195040.data"
## [3] "D:/Documentos/Diego/02.Profesionales/UPJ/DATOS/RADICADO/CP-CO-SP/BSHG_CON@23195090.data"
## [4] "D:/Documentos/Diego/02.Profesionales/UPJ/DATOS/RADICADO/CP-CO-SP/BSHG_CON@23195180.data"
## [5] "D:/Documentos/Diego/02.Profesionales/UPJ/DATOS/RADICADO/CP-CO-SP/BSHG_CON@23195200.data"
## [6] "D:/Documentos/Diego/02.Profesionales/UPJ/DATOS/RADICADO/CP-CO-SP/BSHG_CON@23195502.data"
variables <- sub(".+/", "", ficheros) # Elimina los caracteres hasta el último '/'
variables <- sub("@.+", "", variables) # Elimina los caracteres desde el '@' hasta el final
variables <- unique(variables) # Obtiene los valores únicos
variables
## [1] "BSHG_CON" "DVAG_CON" "DVAG_VECT_MEDIA_D"
## [4] "DVMX_AUT_60" "DVMX_MX_D" "DVMXAG_CON"
## [7] "HR_CAL" "HR_CAL_MN_D" "HR_CAL_MX_D"
## [10] "HRA2_AUT_60" "HRA2_MEDIA_D" "HRA2_MN_D"
## [13] "HRA2_MX_D" "HRHG_CON" "PT_10_MX_D"
## [16] "PT_10_TT_D" "PT_10_TT_H" "PTPM_CON"
## [19] "TA2_AUT_60" "TA2_MEDIA_D" "TA2_MN_D"
## [22] "TA2_MX_D" "TAMN2_AUT_60" "TAMX2_AUT_60"
## [25] "THSM_CON" "THSM_MN_D" "THSM_MX_D"
## [28] "TMN_CON" "TMX_CON" "TSSM_CON"
## [31] "TSSM_MEDIA_D" "TSSM_MN_D" "TSSM_MX_D"
## [34] "TSTG_CON" "VV_10_MEDIA_D" "VV_10_MEDIA_H"
## [37] "VVAG_CON" "VVAG_VECT_MEDIA_D" "VVMX_AUT_60"
## [40] "VVMX_MX_D" "VVMXAG_CON" "CAUDAL_H"
## [43] "NIVEL_H" "NV_MEDIA_D" "NV_MN_D"
## [46] "NV_MX_D" "Q_MEDIA_D" "Q_MN_D"
## [49] "Q_MX_D"
Se debe hacer un ciclo anidado. Es decir, un primer ciclo recorrerá todas las variables (i) y un ciclo dentro de este recorrerá las estaciones que tengan registro de dicha variable (j).
Para seleccionar las estaciones con registro de dicha variable se usa grepl, esta función revisa en que cadenas de caracteres se encuentra el nombre de la variable que se está trabajando. Antes de empezar a recorrer las estaciones se crea un xts vació donde se almacenará la información.
Debido a que esta información contiene las fechas con hora se utiliza variables tipo POSIXct, estos vienen en un formato estándar que se puede especificar mediante “%F %T” y se especifica el uso horario como Tiempo Universal Coordinado (UTC) mediante la instrucción tz = "GMT". Posteriormente se agrupan con todos los datos de dicha variable mediante cbind.
Cuando se trabajan con datos de una periodicidad conocida se puede completar la serie para garantizar que todas las fechas entre el primer y último registro estén en la variable; sin embargo, las 49 variables tiene periodicidades diferentes por lo que este paso se deja para una fase posterior del procesamiento.
for (i in variables){
ficheros.i <- ficheros[grepl(i, ficheros)]
datos <- xts()
for(j in ficheros.i){
datos.j <- read.table(j, header = T, sep = "|")
datos.j <- as.xts(datos.j[,2], order.by = as.POSIXct(datos.j[,1], format = "%F %T", tz = "GMT"))
datos <- cbind(datos, datos.j)
}
}