Lectura y limpieza de datos Climáticos

Datos de la estación del Benito Juárez

Authors
Affiliations

Dr. Carlos Alfonso Muñoz Robles

Director

El Memo de Mileto

Alumno

Published

March 15, 2025

1 Introducción

En este trabajo se realizó la lectura y limpieza de datos climáticos diarios con una captura de datos con intervalos de 15 minutos de las Estaciones Meteorológicas instaladas en el Acuífero de bjuarez en el estado de Zacatecas, en este caos en particular la estación Benito Juárez. Lo que se hizo fue leer los datos diarios de precipitación, temperatura mínima, máxima, radiación solar, humedad relativa y velocidad del viento.

Esto consistió en seis principales pasos:

- 1.- Leer y limpiar los datos, en este caso es necesario eliminar las filas 3 
a la 5, en la fila 1 pasarla como columna y Seleccionar las columnas a trabajar 
(`Date & Time, Temp - °C, Temp., Alta - °C, Temp. Baja - °C, Hum - %, Velocidad 
del viento - km/h, Lluvia - mm, Rad Solar - W/m^2`). En la Imagen 1 se muestra 
un ejemplo de la base de datos, sin procesar.

Imagen 1: Ejemplo de base de datos
- 2.- Realizar una selección de las columnas necesarias que en este caso son: 
Temp - °C, Temp., Alta - °C, Temp. Baja - °C, Hum - %, 
Velocidad del viento - km/h y 
Lluvia - mm.


- 3.- Ya que los datos se registran cada 15 minutos para cada variable, es 
necesario calcular el promedio diario las variables de Temp - °C, Temp., 
Alta - °C, Temp. Baja - °C, Hum - %, Velocidad del viento - km/h, mientras que
para la variable de Lluvia - mm, se realiza el acumulado del día.


- 4.- Completar las fechas de cada estación, es decir encontrar la fecha más 
antigua y la fecha más reciente, y con ello llenar con una secuencia las fechas 
faltantes y por último que las fechas faltantes se rellenen con NA para las tres
variables climáticas.


- 5.- Generar graficos de precipitación y temperatura


- 6.- Exportar la base de datos con los registros diarios de las variables antes mencionada.

2 Paso 1.- Leer todos los archivos en formato .csv

Antes de iniciar con la limpieza de los datos vamos a cargar las librerías necesarias para este trabajo.

Ver código
# Cargar librerias
library(tidyr)
library(Hmisc)
library(DataExplorer)
library(corrplot)
library(devtools)
# install.packages("aedR")
# library(aedR)
library(xts)       # Funciones similares al paquete zoo
library(hydroTSM)  # Análisis y manejo de datos hidrologicos
library(tinytex)   # Publicar Documentos
library(latexpdf)  # Publicar Documentos
library(readr)
library(lubridate)
library(dplyr)
library(readr)  # Para usar read_csv si es necesario
library(DataExplorer)  # Para plot_missing
library(ggplot2)
library(gt)
library(gtExtras)
library(skimr)
library(tidyverse)
library(sf) # Paquete clave para manipular datos espaciales
library(tmap) # Uno de los paquetes para hacer mapas
library(leaflet)
library(mapview)
library(RODBC)
library(climatol)
library(maps)
library(mapdata)
library(purrr)
library(stringr)
library(RColorBrewer)
library(gstat)
library(terra)
library(spData)
# library(spDataLarge)
library(leaflet)
library(leaflet.extras)
library(htmltools)
# install.packages("tidyplots")
library(tidyplots)
library(ggplot2)
library(RColorBrewer)
library(maps) 
library(ggspatial)
library(crosstalk)
library(DT)
# install.packages("vroom")
library(vroom)
library(skimr)
library(hydroTSM)
library(xts)

Para leer todos los archivos de las estaciones meteorológicas del Acuífero de bjuarez, aplicamos el siguiente código:

Ver código
datos <- list.files(path="Datos/Met_4/", pattern="*.csv", full.names = TRUE)

3 Paso 2.- Realizar una selección de las columnas necesarias

Aplicar una función a la variable de datos para leer, limpiar y seleccionar las columnas especificas con las que se va a trabajar.

Ver código
# Función para leer y limpiar los datos
leer_limpiar_datos <- function(file) {
  # Leer el archivo con codificación específica
  # Cambiar "latin1" a "UTF-8" si es necesario
  datos <- read_csv(file, skip = 5, locale = locale(encoding = "latin1"))  
  # Seleccionar las columnas relevantes (ajusta los nombres según lo que veas en names(datos_prueba))
  datos <- datos %>%
    select( c(1,3,4,5,6,9,18,20,23))
  datos <- datos %>%
    mutate(`Date & Time` = parse_date_time(`Date & Time`, orders = c("dmy HM", "mdy HM", "ymd HM")))
  # 
  return(datos)
}

# Aplicar la función a todos los archivos
est_00 <- lapply(datos, leer_limpiar_datos)

Mostrar los nombres de las columnas de lista de est_00 específicamente del objeto 1 de esta lista.

Ver código
# Mostrar los nombres de las columnas
print(names(est_00[[1]]))
[1] "Date & Time"                 "Temp - °C"                  
[3] "Temp. Alta - °C"             "Temp. Baja - °C"            
[5] "Hum - %"                     "Velocidad del viento - km/h"
[7] "Lluvia - mm"                 "Rad Solar - W/m^2"          
[9] "ET - mm"                    

Mostrar los nombres de las columnas de lista de est_00 específicamente del objeto 2 de esta lista.

Ver código
# Mostrar los nombres de las columnas
print(names(est_00[[2]]))
[1] "Date & Time"                 "Temp - °C"                  
[3] "Temp. Alta - °C"             "Temp. Baja - °C"            
[5] "Hum - %"                     "Velocidad del viento - km/h"
[7] "Lluvia - mm"                 "Rad Solar - W/m^2"          
[9] "ET - mm"                    

Mostrar los nombres de las columnas de lista de est_00 específicamente del objeto 2 de esta lista.

Ver código
# Mostrar los nombres de las columnas
print(names(est_00[[3]]))
[1] "Date & Time"                 "Temp - °C"                  
[3] "Temp. Alta - °C"             "Temp. Baja - °C"            
[5] "Hum - %"                     "Velocidad del viento - km/h"
[7] "Lluvia - mm"                 "Rad Solar - W/m^2"          
[9] "ET - mm"                    

Mostrar las primeras 6 observaciones de la columna Date & Time del objeto 1

Ver código
# Mostrar las primeras filas de la columna `Date & Time`
head(est_00[[1]]$`Date & Time`)
[1] "2023-03-01 00:00:00 UTC" "2023-03-01 00:15:00 UTC"
[3] "2023-03-01 00:30:00 UTC" "2023-03-01 00:45:00 UTC"
[5] "2023-03-01 01:00:00 UTC" "2023-03-01 01:15:00 UTC"

Mostrar el tipo de dato de cada variable del objeto 1 de la lista de est_00 del objeto 1

Ver código
# Mostrar las primeras filas de la columna `Date & Time`
str(est_00[[1]])
tibble [35,129 × 9] (S3: tbl_df/tbl/data.frame)
 $ Date & Time                : POSIXct[1:35129], format: "2023-03-01 00:00:00" "2023-03-01 00:15:00" ...
 $ Temp - °C                  : num [1:35129] 13 13 13 14 14 13 12 11 12 13 ...
 $ Temp. Alta - °C            : num [1:35129] 13 13 13 14 14 13 12 11 12 13 ...
 $ Temp. Baja - °C            : num [1:35129] 13 12 13 13 13 12 11 11 11 12 ...
 $ Hum - %                    : num [1:35129] 36 38 36 35 35 37 39 41 38 35 ...
 $ Velocidad del viento - km/h: num [1:35129] 5 10 11 13 14 11 11 11 16 19 ...
 $ Lluvia - mm                : num [1:35129] 0 0 0 0 0 0 0 0 0 0 ...
 $ Rad Solar - W/m^2          : num [1:35129] 0 0 0 0 0 0 0 0 0 0 ...
 $ ET - mm                    : num [1:35129] 0 0 0 0 0.1 0 0 0 0.1 0 ...

Mostrar el tipo de dato de cada variable del objeto 1 de la lista de est_00 del objeto 2

Ver código
# Mostrar las primeras filas de la columna `Date & Time`
str(est_00[[2]])
tibble [35,132 × 9] (S3: tbl_df/tbl/data.frame)
 $ Date & Time                : POSIXct[1:35132], format: "2024-01-01 00:00:00" "2024-01-01 00:15:00" ...
 $ Temp - °C                  : num [1:35132] 5 5 5 5 5 4 4 3 4 3 ...
 $ Temp. Alta - °C            : num [1:35132] 5 5 5 5 5 5 4 4 4 3 ...
 $ Temp. Baja - °C            : num [1:35132] 5 5 5 5 5 4 3 3 3 3 ...
 $ Hum - %                    : num [1:35132] 65 65 64 64 64 68 70 69 69 70 ...
 $ Velocidad del viento - km/h: num [1:35132] 5 3 5 2 3 5 2 3 5 3 ...
 $ Lluvia - mm                : num [1:35132] 0 0 0 0 0 0 0 0 0 0 ...
 $ Rad Solar - W/m^2          : num [1:35132] 0 0 0 0 0 0 0 0 0 0 ...
 $ ET - mm                    : num [1:35132] 0 0 0 0 0 0 0 0 0 0 ...

Mostrar el tipo de dato de cada variable del objeto 1 de la lista de est_00 del objeto 3

Ver código
# Mostrar las primeras filas de la columna `Date & Time`
str(est_00[[3]])
tibble [1,902 × 9] (S3: tbl_df/tbl/data.frame)
 $ Date & Time                : POSIXct[1:1902], format: "2025-01-01 00:00:00" "2025-01-01 00:15:00" ...
 $ Temp - °C                  : num [1:1902] 7 8 8 7 5 6 7 4 3 4 ...
 $ Temp. Alta - °C            : num [1:1902] 8 8 8 7 6 7 7 6 3 4 ...
 $ Temp. Baja - °C            : num [1:1902] 7 8 7 6 4 5 6 3 3 3 ...
 $ Hum - %                    : num [1:1902] 33 32 37 40 42 34 40 49 50 47 ...
 $ Velocidad del viento - km/h: num [1:1902] 3 3 2 3 8 6 3 2 2 3 ...
 $ Lluvia - mm                : num [1:1902] 0 0 0 0 0 0 0 0 0 0 ...
 $ Rad Solar - W/m^2          : num [1:1902] 0 0 0 0 0 0 0 0 0 0 ...
 $ ET - mm                    : num [1:1902] 0 0 0 0 0 0 0 0 0 0 ...

Como se puede observar las variables del objeto 1 son de tipo string o character, excepto la columna 1 (Date & Time) por lo que es necesario convertir a numeric las columnas de la 2 a la 9, esto con el objetivo de unir los dos objetos de la lista y para esto debe haber una homogenización en el tipo de datos de cada objeto.

Ver código
# Convertir las columnas 2 a 9 de la segunda lista a numérico
est_00[[1]] <- est_00[[1]] %>%
  mutate(across(2:9, as.numeric))

Mostrar nuevamente tipo de dato de cada variable del objeto 1 de la lista de est_00 del objeto 1

Ver código
# Mostrar las primeras filas de la columna `Date & Time`
str(est_00[[1]])
tibble [35,129 × 9] (S3: tbl_df/tbl/data.frame)
 $ Date & Time                : POSIXct[1:35129], format: "2023-03-01 00:00:00" "2023-03-01 00:15:00" ...
 $ Temp - °C                  : num [1:35129] 13 13 13 14 14 13 12 11 12 13 ...
 $ Temp. Alta - °C            : num [1:35129] 13 13 13 14 14 13 12 11 12 13 ...
 $ Temp. Baja - °C            : num [1:35129] 13 12 13 13 13 12 11 11 11 12 ...
 $ Hum - %                    : num [1:35129] 36 38 36 35 35 37 39 41 38 35 ...
 $ Velocidad del viento - km/h: num [1:35129] 5 10 11 13 14 11 11 11 16 19 ...
 $ Lluvia - mm                : num [1:35129] 0 0 0 0 0 0 0 0 0 0 ...
 $ Rad Solar - W/m^2          : num [1:35129] 0 0 0 0 0 0 0 0 0 0 ...
 $ ET - mm                    : num [1:35129] 0 0 0 0 0.1 0 0 0 0.1 0 ...

Ya que se homogenizaron los datos es necesario convertir a data frame, con la función de bind_rows() esta función se emplea para unir o agregar filas con un mismo formato, los cuales están o se encuentran en uno o más data frames y unirlo a en un solo data frame.

Ver código
## Convertir a data frame la variable de est_00
# Combinar todas las listas en un solo data frame
est_bjuarez_df <- bind_rows(est_00)

Visualizar un resumen de los datos del nuevo data frame de est_bjuarez_df

Ver código
## Resumen de los datos
summary(est_bjuarez_df)
  Date & Time                       Temp - °C     Temp. Alta - °C
 Min.   :2023-03-01 00:00:00.00   Min.   :-5.00   Min.   :-5.00  
 1st Qu.:2023-09-04 23:37:30.00   1st Qu.:13.00   1st Qu.:13.00  
 Median :2024-02-04 23:00:00.00   Median :17.00   Median :18.00  
 Mean   :2024-02-09 02:53:11.69   Mean   :17.25   Mean   :17.52  
 3rd Qu.:2024-07-16 20:22:30.00   3rd Qu.:23.00   3rd Qu.:23.00  
 Max.   :2025-01-20 19:15:00.00   Max.   :34.00   Max.   :35.00  
                                  NA's   :1       NA's   :1      
 Temp. Baja - °C    Hum - %      Velocidad del viento - km/h
 Min.   :-5.00   Min.   : 1.00   Min.   : 0.0               
 1st Qu.:12.00   1st Qu.:25.00   1st Qu.: 5.0               
 Median :17.00   Median :45.00   Median :10.0               
 Mean   :16.99   Mean   :47.47   Mean   :11.6               
 3rd Qu.:22.00   3rd Qu.:70.00   3rd Qu.:16.0               
 Max.   :34.00   Max.   :97.00   Max.   :63.0               
 NA's   :1       NA's   :1       NA's   :1                  
  Lluvia - mm        Rad Solar - W/m^2    ET - mm       
 Min.   : 0.000000   Min.   :   0.0    Min.   :0.00000  
 1st Qu.: 0.000000   1st Qu.:   0.0    1st Qu.:0.00000  
 Median : 0.000000   Median :   4.0    Median :0.00000  
 Mean   : 0.001494   Mean   : 230.2    Mean   :0.06171  
 3rd Qu.: 0.000000   3rd Qu.: 445.0    3rd Qu.:0.00000  
 Max.   :19.400000   Max.   :1272.0    Max.   :1.30000  
 NA's   :1           NA's   :1         NA's   :1        

Cambiar los nombres de las columnas para tener una mejor identificación de las variables

Ver código
# Cambiar el nombre de las columnas
colnames(est_bjuarez_df)[] <- c("Fecha", "Temp", "Temp_Max", "Tem_Min", "Humedad_Relativa",
                                "Velocidad_Viento","Precipitacion", "Rad_Solar", "ET" )
colnames(est_bjuarez_df)
[1] "Fecha"            "Temp"             "Temp_Max"         "Tem_Min"         
[5] "Humedad_Relativa" "Velocidad_Viento" "Precipitacion"    "Rad_Solar"       
[9] "ET"              

Visualizar las primeras filas de los datos del nuevo data frame de est_bjuarez_df

Ver código
head(est_bjuarez_df)
# A tibble: 6 × 9
  Fecha                Temp Temp_Max Tem_Min Humedad_Relativa Velocidad_Viento
  <dttm>              <dbl>    <dbl>   <dbl>            <dbl>            <dbl>
1 2023-03-01 00:00:00    13       13      13               36                5
2 2023-03-01 00:15:00    13       13      12               38               10
3 2023-03-01 00:30:00    13       13      13               36               11
4 2023-03-01 00:45:00    14       14      13               35               13
5 2023-03-01 01:00:00    14       14      13               35               14
6 2023-03-01 01:15:00    13       13      12               37               11
# ℹ 3 more variables: Precipitacion <dbl>, Rad_Solar <dbl>, ET <dbl>

Visualizar las ultimas filas de los datos del nuevo data frame de est_bjuarez_df

Ver código
tail(est_bjuarez_df)
# A tibble: 6 × 9
  Fecha                Temp Temp_Max Tem_Min Humedad_Relativa Velocidad_Viento
  <dttm>              <dbl>    <dbl>   <dbl>            <dbl>            <dbl>
1 2025-01-20 18:00:00    18       18      18               13               29
2 2025-01-20 18:15:00    18       18      17               14               29
3 2025-01-20 18:30:00    17       17      17               13               26
4 2025-01-20 18:45:00    16       17      16               14               19
5 2025-01-20 19:00:00    15       16      15               15               18
6 2025-01-20 19:15:00    15       15      15               15               19
# ℹ 3 more variables: Precipitacion <dbl>, Rad_Solar <dbl>, ET <dbl>

4 Paso 3.- Conversión a un intervalo de registro diario

Ya que se han unido o se conjuntaron los datos en un solo data frame, es necesario calcular el promedio diario las variables de Temp, Temp_Max, Tem_Min, Humedad_Relativa, Velocidad_Viento, Rad_Solar y Et mientras que para la variable de Precipitacion, se realiza el acumulado del día, esto debido a que estas estaciones registran los datos cada 15 minutos.

Ver código
# Calcular resúmenes diarios
est_bjuarez_diario <- est_bjuarez_df %>%
  mutate(Fecha = as.Date(Fecha)) %>%  # Extraer la fecha (sin la hora)
  group_by(Fecha) %>%                         # Agrupar por fecha
  summarise(
    Temp_promedio = mean(Temp, na.rm = TRUE),
    Temp_Alta_promedio = mean(Temp_Max, na.rm = TRUE),
    Temp_Baja_promedio = mean(Tem_Min, na.rm = TRUE),
    Hum_promedio = mean(Humedad_Relativa, na.rm = TRUE),
    Viento_promedio = mean(Velocidad_Viento, na.rm = TRUE),
    Rad_Solar_promedio = mean(Rad_Solar, na.rm = TRUE),
    ET_promedio = mean(ET, na.rm = TRUE),
    Lluvia_acumulada = sum(Precipitacion, na.rm = TRUE))  

Visualizar un resumen de los datos diarios del nuevo data frame de est_bjuarez_diario

Ver código
## Resumen de los datos
summary(est_bjuarez_diario)
     Fecha            Temp_promedio    Temp_Alta_promedio Temp_Baja_promedio
 Min.   :2023-03-01   Min.   : 1.969   Min.   : 2.219     Min.   : 1.792    
 1st Qu.:2023-08-20   1st Qu.:14.742   1st Qu.:15.042     1st Qu.:14.417    
 Median :2024-02-09   Median :17.964   Median :18.240     Median :17.729    
 Mean   :2024-02-09   Mean   :17.642   Mean   :17.904     Mean   :17.384    
 3rd Qu.:2024-07-31   3rd Qu.:20.659   3rd Qu.:20.904     3rd Qu.:20.417    
 Max.   :2025-01-20   Max.   :26.938   Max.   :27.146     Max.   :26.635    
  Hum_promedio   Viento_promedio  Rad_Solar_promedio  ET_promedio     
 Min.   : 8.26   Min.   : 3.781   Min.   : 25.06     Min.   :0.00625  
 1st Qu.:29.16   1st Qu.: 8.029   1st Qu.:190.89     1st Qu.:0.04479  
 Median :48.30   Median :10.495   Median :239.03     Median :0.06042  
 Mean   :47.93   Mean   :11.452   Mean   :233.86     Mean   :0.06243  
 3rd Qu.:64.83   3rd Qu.:13.734   3rd Qu.:288.09     3rd Qu.:0.07900  
 Max.   :93.10   Max.   :37.479   Max.   :341.55     Max.   :0.12396  
 Lluvia_acumulada 
 Min.   : 0.0000  
 1st Qu.: 0.0000  
 Median : 0.0000  
 Mean   : 0.1558  
 3rd Qu.: 0.0000  
 Max.   :58.8000  

4.1 3.1.- Conversión de las variables de Wind y Slr

Ya que las variables de las estaciones de campo miden la Variable de velocidad del viento en las unidades de km/h, y el modelo hidrológico SWAT requiere esta varibale en las unidades de m/s, es necesario aplicar una conversión, para esto y con base en SWAT VEXA, la cual es es una IA desarrollada por Texas A&M AgriLife Research que colaboró con IBM Sustainability Accelerator para crear el Asistente de extensión virtual SWAT, un asistente virtual interactivo de inteligencia artificial que brinda información sobre el suelo y el agua de fácil uso para respaldar la toma de decisiones sobre agricultura y recursos naturales. Para obtener ayuda, comuníquese con: eco.web@tamu.edu. Esta IA nos indica que “No se puede convertir directamente la velocidad del viento de km/h a m/s, pero sí se puede convertir a metros por segundo multiplicando por 5/18. Por ejemplo, 5 km/h es igual a 5 * 5/18 m/s”. Por lo que es necesario realziar una funcion para realziar la conversión:

Ver código
# Función para convertir km/h a m/s
kmh_a_ms <- function(velocidad_kmh) {
  velocidad_ms <- velocidad_kmh * (5 / 18)  # Fórmula de conversión
  return(velocidad_ms)
}


est_bjuarez_diario$Viento_promedio_ms <- kmh_a_ms(est_bjuarez_diario$Viento_promedio)  # Convertir a m/s

# Mostrar el resultado
print(est_bjuarez_diario$Viento_promedio_ms)
  [1]  4.048032  6.302083  5.240162  3.663194  3.046875  2.508681  2.071759
  [8]  2.138310  1.869213  1.811343  3.342014  2.760417  4.820602  3.067130
 [15]  3.414352  6.400463  5.844907  5.413773  3.964120  4.586227  4.551505
 [22]  4.409722  5.905671  4.971065  2.980324  4.293981  4.363426  3.125000
 [29]  3.654514  4.126157  2.789352  2.346644  3.394097  4.415509  5.969329
 [36]  4.085648  5.141782  4.470486  2.844329  2.002315  3.822338  3.483796
 [43]  2.280093  5.520833  5.454282  3.417245  4.059606  5.321181  5.465856
 [50]  4.447338  4.348958  4.094329  4.719329  5.622106  5.196759  4.343171
 [57]  4.198495  4.259259  4.800347  4.131944  1.915509  5.925926  6.145833
 [64]  4.030671  4.658565  2.216435  2.037037  2.795139  4.085648  5.312500
 [71]  5.295139  3.645833  4.936343  4.001736  3.862847  3.344907  2.598380
 [78]  3.009259  2.563657  2.207755  3.362269  1.883681  2.048611  3.634259
 [85]  2.285880  3.006366  3.417245  4.618056  5.321181  2.977431  1.967593
 [92]  3.269676  3.813657  2.384259  3.961227  4.178241  2.470760  3.151042
 [99]  2.254051  3.527199  2.125731  3.440394  2.361111  3.110532  2.705440
[106]  2.083333  3.113426  3.651620  3.680556  2.612847  3.631366  3.136574
[113]  2.954282  3.133681  3.738426  3.680556  4.143519  4.435764  4.391813
[120]  3.666088  4.053819  3.654514  2.291667  2.754630  3.420139  2.685185
[127]  2.013889  3.072917  2.546296  2.688079  2.068866  3.579282  2.916667
[134]  2.546296  2.695906  3.090278  3.677662  3.804977  4.013310  3.637153
[141]  3.671875  3.590856  2.997685  3.570602  3.518519  3.394097  3.616898
[148]  2.907986  2.991898  3.194444  2.586806  3.998843  3.142361  3.204678
[155]  3.107639  3.888889  3.987269  2.505787  2.552083  2.913773  3.058449
[162]  3.110532  2.832755  3.559028  1.802662  3.151042  4.366319  4.696181
[169]  3.792398  3.530093  3.466435  2.899306  3.159722  2.465278  2.439236
[176]  3.185764  3.437500  2.609954  2.161458  2.731481  2.077546  1.840278
[183]  2.540509  1.903935  2.228009  1.368634  2.520255  2.048611  2.511574
[190]  3.041088  3.078704  2.294560  2.864583  3.590856  2.366898  2.343750
[197]  2.306134  2.086227  3.127894  2.815394  3.026620  2.381366  2.141204
[204]  2.303241  1.901042  2.164352  1.840278  2.115162  2.893519  2.476852
[211]  2.520255  2.332176  2.196181  2.390046  2.832755  3.207602  2.575231
[218]  2.560764  2.077546  4.071181  3.744213  3.582176  2.297454  3.026620
[225]  2.685185  4.615162  2.005208  2.821181  2.630208  3.287037  1.808449
[232]  1.461227  2.152778  2.945602  2.821181  4.539931  5.014468  3.969907
[239]  2.329282  1.924190  2.913773  2.500000  1.469907  2.552083  3.524306
[246]  2.928241  1.559606  1.516204  1.993634  1.495949  1.302083  1.432292
[253]  1.391782  2.158565  1.585648  1.961806  2.835648  1.490162  1.568287
[260]  1.359954  1.064815  1.559606  1.244213  2.809942  4.484954  3.625579
[267]  3.981481  2.453704  4.256366  3.874421  2.699653  2.566551  1.964699
[274]  3.668981  4.904514  4.372106  2.662037  1.226852  1.200810  1.967593
[281]  3.243634  3.200231  3.573495  1.964699  1.530671  2.037037  2.433449
[288]  2.731481  2.129630  1.400463  1.883681  1.050347  1.614583  1.605903
[295]  1.912616  1.131366  1.278935  2.453704  3.663194  3.532986  2.983218
[302]  2.812500  2.566551  1.921296  1.183449  2.230903  2.120949  4.062500
[309]  2.962963  5.454282  5.069444  3.906250  5.598958 10.410880  5.706019
[316]  4.846644  5.651042  3.585069  4.299769  3.130787  3.197338  2.450810
[323]  3.197338  2.210648  2.329282  3.281250  3.770255  5.159144  4.942130
[330]  4.918981  3.761574  3.784722  1.657986  1.464120  1.487269  1.293403
[337]  1.597222  2.352431  5.787037  6.501736  4.097222  2.010995  1.866319
[344]  4.502315  3.897569  4.293981  5.972222  5.622106  1.996528  8.313079
[351]  5.804398  2.326389  4.823495  3.440394  1.203704  2.870370  1.461227
[358]  2.280093  3.486690  1.765046  1.221065  1.472801  2.123843  4.846644
[365]  3.136574  4.418403  4.424399  4.467593  5.558449  5.332755  3.802083
[372]  3.628472  5.778356  5.648148  4.508102  3.067130  3.055556  3.582176
[379]  4.166667  5.558449  4.985532  4.788773  5.729167  3.984375  3.946759
[386]  5.639468  7.326389  2.771991  3.912037  7.505787  9.710648  6.244213
[393]  3.819444  2.809606  3.802083  5.642361  4.771412  7.439236  7.366898
[400]  3.148148  3.385417  4.774306  5.894097  5.329861  6.177662  8.564327
[407]  3.678363  3.495370  2.777778  1.730324  2.031250  3.110532  3.726852
[414]  2.717014  2.254051  2.699653  4.771412  3.058449  5.124421  3.547454
[421]  2.621528  4.574653  4.751157  6.203704  4.539931  2.332176  3.790509
[428]  5.740741  5.957755  5.289352  4.473380  4.152199  5.688657  4.565972
[435]  4.450231  2.450810  2.028356  3.521412  5.072338  4.675926  4.337384
[442]  4.719329  5.868056  6.079282  2.228009  2.346644  2.766204  3.324653
[449]  2.962963  2.873264  2.074653  2.821181  2.786458  2.821181  3.836806
[456]  2.528935  3.637153  3.758681  2.934028  3.758681  4.244792  3.489583
[463]  3.897569  3.125000  4.224537  2.641782  2.667824  3.955440  3.388310
[470]  3.619792  3.104745  3.408565  3.388310  3.347801  3.475116  3.984375
[477]  6.171875  7.398727  5.425347  2.459491  2.931134  2.598380  2.656250
[484]  2.424769  3.376736  2.187500  3.258102  2.708333  4.172454  4.027778
[491]  2.763310  1.927083  1.799769  2.896412  2.346644  2.424769  2.549190
[498]  3.000579  3.532986  3.822338  3.755787  2.786458  2.323495  1.880787
[505]  2.115162  1.932870  2.216435  2.592593  2.398727  2.511574  2.274306
[512]  2.094907  2.907986  2.907986  2.219329  2.132523  2.754630  2.693866
[519]  2.899306  2.708333  2.954282  1.796875  1.953125  2.824074  2.181713
[526]  1.857639  2.445023  3.518519  3.292824  2.601273  2.847222  3.570602
[533]  2.743056  2.861690  2.962963  2.841435  2.326389  3.012153  3.298611
[540]  3.052662  3.266782  2.991898  2.838542  2.554977  2.977431  2.511574
[547]  2.074653  1.982456  2.236690  1.984954  1.741898  1.652199  1.241319
[554]  2.546296  1.799769  3.385417  3.532986  3.237847  1.710069  1.409144
[561]  1.906829  1.996528  3.234954  2.060185  1.802662  1.744792  1.739005
[568]  1.814236  2.065972  1.846065  2.196181  2.647569  3.174190  3.211806
[575]  3.096065  2.332176  2.751736  3.350694  2.500000  2.280093  2.881944
[582]  2.421875  1.938657  2.109375  2.239583  2.560764  2.497106  2.181713
[589]  2.653356  2.896412  2.361111  2.737269  2.092014  1.458333  1.493056
[596]  2.314815  3.307292  1.820023  3.657407  3.370949  2.546784  2.190394
[603]  2.225116  1.666667  2.317708  3.281250  2.450810  1.987847  2.991898
[610]  3.055556  2.748843  2.760417  2.670718  4.265046  4.464699  2.612847
[617]  3.506944  3.203125  1.909722  2.271412  1.461227  1.070602  1.423611
[624]  2.242477  3.414352  1.160301  2.459491  4.586227  4.979745  2.705440
[631]  1.767940  2.010995  1.131366  1.377315  1.568287  1.877894  1.681134
[638]  1.223958  1.371528  1.550926  1.296296  1.056134  1.626157  3.194444
[645]  1.281829  1.617477  3.015046  2.233796  2.094907  2.563657  3.197338
[652]  1.872106  2.303241  2.406433  1.252894  1.695602  1.160301  2.413194
[659]  2.418981  2.800926  2.433449  1.579861  1.727431  1.831597  1.999421
[666]  3.425926  2.375579  2.445023  2.528935  1.383041  1.846065  1.707176
[673]  1.646621  1.788194  2.311921  2.366898  3.648727  3.463542  4.450231
[680]  4.866898  8.923611  8.532986  2.291667  5.364583  3.330440  3.237847
[687]  1.536458  2.152778  5.251736  6.568287  3.269676  4.814815

Ahora hay que relaizar la conversión de radiación solar en W/m² a unidades de MJ/ m²

Ver código
# Función para convertir radiación solar de W/m² a MJ/m²/día
convert_solar_radiation <- function(rad_wm2, hours = 24) {
  # Fórmula de conversión: 
  # 1 W/m² durante 1 segundo = 0.000001 MJ/m²
  # Para convertir a MJ/m²/día multiplicamos por (3600 * hours) segundos
  # y por 0.000001 para convertir de Joules a Megajoules
  rad_mjm2 <- rad_wm2 * (3600 * hours) * 0.000001
  return(round(rad_mjm2, 2))
}


est_bjuarez_diario$Rad_Solar_mj <- convert_solar_radiation(est_bjuarez_diario$Rad_Solar_promedio)  # Convertir a MJ/m²

seleccionar las variables

Ver código
est_bjuarez_diario <- est_bjuarez_diario %>% select(1,9,3:5,10,11)

5 Paso 4.- Completar las fechas de cada estación

Como se puede observar en el resumen anterior el inicio de registro de datos para esta estación es del 25 de Enero del 2023 y tiene un dato final de registro(Hasta el momento) del 20 de Enero del 2025, por lo que para tener un mejor manejo de los datos vamos a incorporar los días faltantes iniciando desde el 1 de Enero del 2023 al 20 de Enero del 2025, con el objetivo de tener años cerrados, y que en los días que no se tiene registro rellenar un NA

Como primer paso es necesario generar las fechas de inicio(01/01/2023) y final (20/01/2025)

Ver código
# Definir las fechas para realizar el ciclo pra rellenar los datos 
# Definir las fechas para realizar el ciclo pra rellenar los datos 
inicio <- as.Date("01/01/2023", format = "%d/%m/%Y")
final <- as.Date("20/01/2025", format = "%d/%m/%Y")

Ya definidas las fechas de inicio y final, es necesario generar una secuencia por día para el data frame de est_bjuarez_resumen, y rellenar con NA, los días donde la estación no tiene registro.

Ver código
## Generar un ciclo 
# Aplicar un ciclo for para agregar los datos de inicio y final y 
# que avance por díaa
est_bjuarez <- est_bjuarez_diario %>%
  complete(Fecha = seq(from = inicio, to = final, by = "day"),
           fill = list(Temp_promedio = NA, Temp_Alta_promedio = NA,
                       Temp_Baja_promedio = NA, Hum_promedio = NA,
                       Viento_promedio = NA, Rad_Solar_promedio = NA,
                       ET_promedio = NA, Lluvia_acumulada = NA))

Visualizar un resumen de los datos diarios pero con la aplicación de la secuencia de datos

Ver código
## Resumen de los datos
summary(est_bjuarez)
     Fecha            Lluvia_acumulada  Temp_Alta_promedio Temp_Baja_promedio
 Min.   :2023-01-01   Min.   : 0.0000   Min.   : 2.219     Min.   : 1.792    
 1st Qu.:2023-07-07   1st Qu.: 0.0000   1st Qu.:15.042     1st Qu.:14.417    
 Median :2024-01-11   Median : 0.0000   Median :18.240     Median :17.729    
 Mean   :2024-01-11   Mean   : 0.1558   Mean   :17.904     Mean   :17.384    
 3rd Qu.:2024-07-16   3rd Qu.: 0.0000   3rd Qu.:20.904     3rd Qu.:20.417    
 Max.   :2025-01-20   Max.   :58.8000   Max.   :27.146     Max.   :26.635    
                      NA's   :59        NA's   :59         NA's   :59        
  Hum_promedio   Viento_promedio_ms  Rad_Solar_mj  
 Min.   : 8.26   Min.   : 1.050     Min.   : 2.17  
 1st Qu.:29.16   1st Qu.: 2.230     1st Qu.:16.49  
 Median :48.30   Median : 2.915     Median :20.66  
 Mean   :47.93   Mean   : 3.181     Mean   :20.21  
 3rd Qu.:64.83   3rd Qu.: 3.815     3rd Qu.:24.89  
 Max.   :93.10   Max.   :10.411     Max.   :29.51  
 NA's   :59      NA's   :59         NA's   :59     

Como se puede observer en el resumen anteriror ya tenemos datos desde el 1 de Enero del 2023 al 20 de Enero del 2025, con los datos faltantes con NA

Revisemos las primeras observaciones datos del nuevo data frame de est_bjuarez

Ver código
head(est_bjuarez)
# A tibble: 6 × 7
  Fecha      Lluvia_acumulada Temp_Alta_promedio Temp_Baja_promedio Hum_promedio
  <date>                <dbl>              <dbl>              <dbl>        <dbl>
1 2023-01-01               NA                 NA                 NA           NA
2 2023-01-02               NA                 NA                 NA           NA
3 2023-01-03               NA                 NA                 NA           NA
4 2023-01-04               NA                 NA                 NA           NA
5 2023-01-05               NA                 NA                 NA           NA
6 2023-01-06               NA                 NA                 NA           NA
# ℹ 2 more variables: Viento_promedio_ms <dbl>, Rad_Solar_mj <dbl>

Visualizar las ultimas filas de los datos del nuevo data frame de est_bjuarez_df

Ver código
tail(est_bjuarez)
# A tibble: 6 × 7
  Fecha      Lluvia_acumulada Temp_Alta_promedio Temp_Baja_promedio Hum_promedio
  <date>                <dbl>              <dbl>              <dbl>        <dbl>
1 2025-01-15                0               15.8               15.3         39.5
2 2025-01-16                0               13.2               12.6         44.1
3 2025-01-17                0               15.0               14.3         41.3
4 2025-01-18                0               14.4               13.8         48.0
5 2025-01-19                0               12.6               11.9         40.1
6 2025-01-20                0               12.5               11.7         30.7
# ℹ 2 more variables: Viento_promedio_ms <dbl>, Rad_Solar_mj <dbl>

6 Paso 5.- Generar graficos de los datos

Generar un histograma de los datos de precipitación

Ver código
ggplot(data = est_bjuarez, aes(x = Lluvia_acumulada)) +
  geom_histogram(binwidth = 5, fill = "skyblue", color = "black") +
  labs(x = "Precipitación acumulada (mm)", y = "Frecuencia",
       title = "Distribución de la Precipitación Acumulada en la Estación Benito Juárez") +
  theme_minimal()

Generar un grafico de precipitación diaria

Ver código
ggplot(data = est_bjuarez, aes(x = Fecha, y = Lluvia_acumulada)) +
  geom_bar(stat = "identity", fill = "skyblue") +  # Color azul claro para la precipitación
  xlab("Fecha") + 
  ylab("Precipitación acumulada (mm)") +
  ggtitle("Precipitación Diaria en la Estación Benito Juárez (2023-2025)") +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 16),
    axis.title = element_text(size = 12),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

Generar un grafico de temperatura media diaria

Ver código
ggplot(data = est_bjuarez) +
  # geom_line(mapping = aes(x = Fecha, y = Temp_promedio, color = "Promedio"), linetype = "dashed") +
  # geom_point(mapping = aes(x = Fecha, y = Temp_promedio), color = "gray") +
  geom_line(mapping = aes(x = Fecha, y = Temp_Alta_promedio, color = "Máxima")) +  # Cambia "Alta" a "Máxima" para mayor claridad
  geom_point(mapping = aes(x = Fecha, y = Temp_Alta_promedio), color = "red") +
  geom_line(mapping = aes(x = Fecha, y = Temp_Baja_promedio, color = "Mínima")) +  # Cambia "Baja" a "Mínima" para mayor claridad
  geom_point(mapping = aes(x = Fecha, y = Temp_Baja_promedio), color = "blue") +
  xlab("Fecha") + 
  ylab("Temperatura en centigrados °C") +
  ggtitle("Temperatura Diaria (2023-2025)\n Estación Benito Juárez") +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5),
    axis.text.x = element_text(angle = 45, hjust = 1)
  ) +
  labs(color = "Tipo de Temperatura")  # Cambia el título de la leyenda

Ahora vamos a convertir la variable de Lluvia_acumulada del data frame de est_bjuarez a un objeto tipo xts, este tipo de objetos en R son una clase de serie de tiempo extensible que permite manejar de manera uniforme diferentes tipos de series de tiempo. El nuevo objeto llevara el nombre de st_bjuarez_xts

Ver código
est_bjuarez_xts <- xts(est_bjuarez$Lluvia_acumulada, order.by = est_bjuarez$Fecha)

Empleando la librería de hydroTSM que proporciona funciones S3 para la gestión, análisis y representación gráfica de series temporales utilizadas en hidrología y ciencias ambientales relacionadas,se generaron graficos de densidad para revisar a nivel mensual o anual la cantidad de datos de la estación, así como los datos faltantes.

Primero revisemos la cantidad de datos con información es decir sin NA

Ver código
dwi(est_bjuarez_xts)
        
2023 306
2024 366
2025  20

Como se puede observar hay 17 días sin datos en el año del 2023 que es donde inicio el registro de datos de esta estación, el año 2024 está completo y 20 días de registro del 2025 que es la última actualización que se hizo, cabe mencionar que a la fecha de hoy ya deben encontrarse aún más registros.

Ahora revisemos el resumen de datos Heat Map de los datos, para cada año.

Ver código
calendarHeatmap(est_bjuarez_xts)

En este grafico podemos observar que el años 2024 fue mucho más lluvioso que el 2023.

Ahora vamos a generar una matriz para poder generar un Heat Map de menra mensula para cada año.

Ver código
# Daily zoo to monthly zoo
m <- daily2monthly(est_bjuarez_xts, FUN=sum, na.rm=TRUE)

# Creating a matrix with monthly values per year in each column
M <- matrix(m, ncol=12, byrow=TRUE)
colnames(M) <- month.abb
rownames(M) <- unique(format(time(m), "%Y"))

Despues de generar la matriz (M), mapeamos el Heat Map mensual

Ver código
print(matrixplot(M, ColorRamp="Precipitation",
main="Precipitación mensual en la estación Benito Juárez [mm/mensuales]"))

7 Paso 6.- Exportar los datos

Por ultimo vamos a exportar el data frame de est_bjuarez, a un formato .csv

Ver código
write.csv(est_bjuarez, "Datos/Resultados/est_bjuarez.csv", row.names = FALSE)