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.
- 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.
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
# 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
# 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>
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
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)
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
# 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
# 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>
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
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]"))
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)