Introducción

Información obtenida del Automated Surface Observing System (ASOS) de los aeropuertos de todo el mundo.

Instalar paquetes y llamar librerías

#install.packages("riem")
library(riem)
# install.packages("tidyverse")
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.0     ✔ readr     2.1.6
## ✔ forcats   1.0.1     ✔ stringr   1.6.0
## ✔ ggplot2   4.0.2     ✔ tibble    3.3.1
## ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
## ✔ purrr     1.2.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# install.packages("ggplot2")
library(ggplot2)
# install.packages("lubridate")
library(lubridate)

Obtener y graficar la información

# PASO 1. Buscar la red (país) - Ejemplo: México, y copiar CODE
#view(riem_networks())

# PASO 2. Buscar la estación (ciudad) - Ejemplo: Monterrey, y copiar ID
#view(riem_stations("MX__ASOS"))

# PASO 3. Obtener información de la estación
monterrey <- riem_measures("MMMY", date_start = "2025-11-01")

# Análisis Descriptivo
summary(monterrey)
##    station              valid                          tmpf      
##  Length:2875        Min.   :2025-11-01 00:41:00   Min.   :28.40  
##  Class :character   1st Qu.:2025-11-30 13:10:00   1st Qu.:57.20  
##  Mode  :character   Median :2025-12-29 13:12:00   Median :64.40  
##                     Mean   :2025-12-29 14:17:30   Mean   :64.18  
##                     3rd Qu.:2026-01-27 06:10:00   3rd Qu.:71.60  
##                     Max.   :2026-02-25 23:40:00   Max.   :98.60  
##                                                                  
##       dwpf            relh             drct            sknt             p01i  
##  Min.   :12.20   Min.   :  7.26   Min.   :  0.0   Min.   : 0.000   Min.   :0  
##  1st Qu.:39.20   1st Qu.: 43.30   1st Qu.: 60.0   1st Qu.: 3.000   1st Qu.:0  
##  Median :51.80   Median : 64.96   Median :120.0   Median : 5.000   Median :0  
##  Mean   :48.91   Mean   : 62.94   Mean   :152.3   Mean   : 5.051   Mean   :0  
##  3rd Qu.:59.00   3rd Qu.: 82.63   3rd Qu.:290.0   3rd Qu.: 7.000   3rd Qu.:0  
##  Max.   :69.80   Max.   :100.00   Max.   :360.0   Max.   :25.000   Max.   :0  
##                                   NA's   :3                                   
##       alti            mslp           vsby            gust      
##  Min.   :29.62   Min.   :1002   Min.   : 0.12   Min.   :12.00  
##  1st Qu.:29.98   1st Qu.:1015   1st Qu.: 6.00   1st Qu.:18.00  
##  Median :30.11   Median :1019   Median : 8.00   Median :23.00  
##  Mean   :30.13   Mean   :1020   Mean   : 8.30   Mean   :23.01  
##  3rd Qu.:30.25   3rd Qu.:1024   3rd Qu.:10.00   3rd Qu.:26.00  
##  Max.   :30.69   Max.   :1101   Max.   :15.00   Max.   :48.00  
##                  NA's   :1939                   NA's   :2720   
##     skyc1              skyc2              skyc3            skyc4        
##  Length:2875        Length:2875        Length:2875        Mode:logical  
##  Class :character   Class :character   Class :character   NA's:2875     
##  Mode  :character   Mode  :character   Mode  :character                 
##                                                                         
##                                                                         
##                                                                         
##                                                                         
##      skyl1           skyl2           skyl3        skyl4        
##  Min.   :  100   Min.   :  500   Min.   : 1600   Mode:logical  
##  1st Qu.: 1500   1st Qu.: 1500   1st Qu.:20000   NA's:2875     
##  Median : 3000   Median : 4500   Median :20000                 
##  Mean   : 5878   Mean   : 6978   Mean   :17215                 
##  3rd Qu.: 8000   3rd Qu.: 8000   3rd Qu.:20000                 
##  Max.   :20000   Max.   :20000   Max.   :20000                 
##  NA's   :1255    NA's   :2214    NA's   :2849                  
##    wxcodes          ice_accretion_1hr ice_accretion_3hr ice_accretion_6hr
##  Length:2875        Mode:logical      Mode:logical      Mode:logical     
##  Class :character   NA's:2875         NA's:2875         NA's:2875        
##  Mode  :character                                                        
##                                                                          
##                                                                          
##                                                                          
##                                                                          
##  peak_wind_gust peak_wind_drct peak_wind_time      feel      
##  Mode:logical   Mode:logical   Mode:logical   Min.   :27.99  
##  NA's:2875      NA's:2875      NA's:2875      1st Qu.:57.20  
##                                               Median :64.40  
##                                               Mean   :63.78  
##                                               3rd Qu.:71.60  
##                                               Max.   :94.14  
##                                                              
##     metar           snowdepth     
##  Length:2875        Mode:logical  
##  Class :character   NA's:2875     
##  Mode  :character                 
##                                   
##                                   
##                                   
## 
str(monterrey)
## tibble [2,875 × 30] (S3: tbl_df/tbl/data.frame)
##  $ station          : chr [1:2875] "MMMY" "MMMY" "MMMY" "MMMY" ...
##  $ valid            : POSIXct[1:2875], format: "2025-11-01 00:41:00" "2025-11-01 01:40:00" ...
##  $ tmpf             : num [1:2875] 66.2 64.4 62.6 60.8 59 57.2 57.2 57.2 59 57.2 ...
##  $ dwpf             : num [1:2875] 50 50 50 50 51.8 51.8 53.6 53.6 53.6 55.4 ...
##  $ relh             : num [1:2875] 55.9 59.5 63.4 67.5 77 ...
##  $ drct             : num [1:2875] 100 120 0 100 90 0 0 0 0 0 ...
##  $ sknt             : num [1:2875] 5 5 0 4 3 0 0 0 0 0 ...
##  $ p01i             : num [1:2875] 0 0 0 0 0 0 0 0 0 0 ...
##  $ alti             : num [1:2875] 30 30 30 30 30 ...
##  $ mslp             : num [1:2875] NA NA 1017 NA NA ...
##  $ vsby             : num [1:2875] 12 10 10 10 10 10 10 10 10 10 ...
##  $ gust             : num [1:2875] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc1            : chr [1:2875] "CLR" "CLR" "CLR" "CLR" ...
##  $ skyc2            : chr [1:2875] NA NA NA NA ...
##  $ skyc3            : chr [1:2875] NA NA NA NA ...
##  $ skyc4            : logi [1:2875] NA NA NA NA NA NA ...
##  $ skyl1            : num [1:2875] NA NA NA NA NA NA 3000 3000 3000 3000 ...
##  $ skyl2            : num [1:2875] NA NA NA NA NA NA 7000 NA NA NA ...
##  $ skyl3            : num [1:2875] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl4            : logi [1:2875] NA NA NA NA NA NA ...
##  $ wxcodes          : chr [1:2875] NA NA NA NA ...
##  $ ice_accretion_1hr: logi [1:2875] NA NA NA NA NA NA ...
##  $ ice_accretion_3hr: logi [1:2875] NA NA NA NA NA NA ...
##  $ ice_accretion_6hr: logi [1:2875] NA NA NA NA NA NA ...
##  $ peak_wind_gust   : logi [1:2875] NA NA NA NA NA NA ...
##  $ peak_wind_drct   : logi [1:2875] NA NA NA NA NA NA ...
##  $ peak_wind_time   : logi [1:2875] NA NA NA NA NA NA ...
##  $ feel             : num [1:2875] 66.2 64.4 62.6 60.8 59 57.2 57.2 57.2 59 57.2 ...
##  $ metar            : chr [1:2875] "MMMY 010041Z 10005KT 12SM SKC 19/10 A3003" "MMMY 010140Z 12005KT 10SM SKC 18/10 A3004" "MMMY 010240Z 00000KT 10SM SKC 17/10 A3004 RMK SLP171 52004 976" "MMMY 010340Z 10004KT 10SM SKC 16/10 A3003" ...
##  $ snowdepth        : logi [1:2875] NA NA NA NA NA NA ...
# Filtrar información del último mes

mty_nov_25 <- subset(monterrey, valid >= as.POSIXct("2025-11-01 00:00") & valid <= as.POSIXct("2025-11-30 23:59"))

# Ejercicio 1: Realizar una gráfica de barras de la temperatura promedio diario en agosto en Monterrey en °C.
monterrey2 <- riem_measures("MMMY", date_start = "2025-08-01")

mty_aug_25 <- subset(monterrey2, valid >= as.POSIXct("2025-08-01 00:00") & valid <=  as.POSIXct("2025-09-01 00:00"))

mty_aug_25$dia <- as.Date(mty_aug_25$valid)
mty_aug_25$tmpc <- (mty_aug_25$tmpf - 32) * 5/9

promedio_diario <- aggregate(
  tmpc ~ dia,
  data = mty_aug_25,
  FUN = mean,
  na.rm = TRUE
)

ggplot(promedio_diario, aes(x = dia, y = tmpc)) +
  geom_col(fill = "cyan") +
  geom_point(color = "blue") +
  labs(
    title = "Temperatura Promedio Diaria en Agosto 2025",
    subtitle = "Monterrey, México",
    x = "Día",
    y = "Temperatura Promedio (°C)"
  ) +
  theme_minimal()

LS0tDQp0aXRsZTogIkFTU09TIg0KYXV0aG9yOiAiTHVjZXJvX1NhbGF6YXJfQTAwODM0ODkzIg0KZGF0ZTogIjIwMjYtMDItMjYiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogZGFya2x5DQotLS0NCg0KIVtdKCkNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHllbGxvdzsiPkludHJvZHVjY2nDs248L3NwYW4+DQpJbmZvcm1hY2nDs24gb2J0ZW5pZGEgZGVsICpBdXRvbWF0ZWQgU3VyZmFjZSBPYnNlcnZpbmcgU3lzdGVtIChBU09TKSogZGUgbG9zIGFlcm9wdWVydG9zIGRlIHRvZG8gZWwgbXVuZG8uDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiB5ZWxsb3c7Ij5JbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzPC9zcGFuPg0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygicmllbSIpDQpsaWJyYXJ5KHJpZW0pDQojIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiMgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQpsaWJyYXJ5KGdncGxvdDIpDQojIGluc3RhbGwucGFja2FnZXMoImx1YnJpZGF0ZSIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmBgYA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+T2J0ZW5lciB5IGdyYWZpY2FyIGxhIGluZm9ybWFjacOzbjwvc3Bhbj4NCmBgYHtyfQ0KIyBQQVNPIDEuIEJ1c2NhciBsYSByZWQgKHBhw61zKSAtIEVqZW1wbG86IE3DqXhpY28sIHkgY29waWFyIENPREUNCiN2aWV3KHJpZW1fbmV0d29ya3MoKSkNCg0KIyBQQVNPIDIuIEJ1c2NhciBsYSBlc3RhY2nDs24gKGNpdWRhZCkgLSBFamVtcGxvOiBNb250ZXJyZXksIHkgY29waWFyIElEDQojdmlldyhyaWVtX3N0YXRpb25zKCJNWF9fQVNPUyIpKQ0KDQojIFBBU08gMy4gT2J0ZW5lciBpbmZvcm1hY2nDs24gZGUgbGEgZXN0YWNpw7NuDQptb250ZXJyZXkgPC0gcmllbV9tZWFzdXJlcygiTU1NWSIsIGRhdGVfc3RhcnQgPSAiMjAyNS0xMS0wMSIpDQoNCiMgQW7DoWxpc2lzIERlc2NyaXB0aXZvDQpzdW1tYXJ5KG1vbnRlcnJleSkNCnN0cihtb250ZXJyZXkpDQoNCiMgRmlsdHJhciBpbmZvcm1hY2nDs24gZGVsIMO6bHRpbW8gbWVzDQoNCm10eV9ub3ZfMjUgPC0gc3Vic2V0KG1vbnRlcnJleSwgdmFsaWQgPj0gYXMuUE9TSVhjdCgiMjAyNS0xMS0wMSAwMDowMCIpICYgdmFsaWQgPD0gYXMuUE9TSVhjdCgiMjAyNS0xMS0zMCAyMzo1OSIpKQ0KDQojIEVqZXJjaWNpbyAxOiBSZWFsaXphciB1bmEgZ3LDoWZpY2EgZGUgYmFycmFzIGRlIGxhIHRlbXBlcmF0dXJhIHByb21lZGlvIGRpYXJpbyBlbiBhZ29zdG8gZW4gTW9udGVycmV5IGVuIMKwQy4NCm1vbnRlcnJleTIgPC0gcmllbV9tZWFzdXJlcygiTU1NWSIsIGRhdGVfc3RhcnQgPSAiMjAyNS0wOC0wMSIpDQoNCm10eV9hdWdfMjUgPC0gc3Vic2V0KG1vbnRlcnJleTIsIHZhbGlkID49IGFzLlBPU0lYY3QoIjIwMjUtMDgtMDEgMDA6MDAiKSAmIHZhbGlkIDw9ICBhcy5QT1NJWGN0KCIyMDI1LTA5LTAxIDAwOjAwIikpDQoNCm10eV9hdWdfMjUkZGlhIDwtIGFzLkRhdGUobXR5X2F1Z18yNSR2YWxpZCkNCm10eV9hdWdfMjUkdG1wYyA8LSAobXR5X2F1Z18yNSR0bXBmIC0gMzIpICogNS85DQoNCnByb21lZGlvX2RpYXJpbyA8LSBhZ2dyZWdhdGUoDQogIHRtcGMgfiBkaWEsDQogIGRhdGEgPSBtdHlfYXVnXzI1LA0KICBGVU4gPSBtZWFuLA0KICBuYS5ybSA9IFRSVUUNCikNCg0KZ2dwbG90KHByb21lZGlvX2RpYXJpbywgYWVzKHggPSBkaWEsIHkgPSB0bXBjKSkgKw0KICBnZW9tX2NvbChmaWxsID0gImN5YW4iKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJUZW1wZXJhdHVyYSBQcm9tZWRpbyBEaWFyaWEgZW4gQWdvc3RvIDIwMjUiLA0KICAgIHN1YnRpdGxlID0gIk1vbnRlcnJleSwgTcOpeGljbyIsDQogICAgeCA9ICJEw61hIiwNCiAgICB5ID0gIlRlbXBlcmF0dXJhIFByb21lZGlvICjCsEMpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCg0KYGBgDQo=