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 = "2026-01-01")

# Análisis Descriptivo
summary(monterrey)
##    station              valid                          tmpf      
##  Length:1374        Min.   :2026-01-01 00:40:00   Min.   :28.40  
##  Class :character   1st Qu.:2026-01-15 03:56:00   1st Qu.:55.40  
##  Mode  :character   Median :2026-01-28 14:10:30   Median :62.60  
##                     Mean   :2026-01-28 21:43:45   Mean   :62.37  
##                     3rd Qu.:2026-02-11 19:03:15   3rd Qu.:69.80  
##                     Max.   :2026-02-25 23:40:00   Max.   :98.60  
##                                                                  
##       dwpf           relh             drct            sknt             p01i  
##  Min.   :12.2   Min.   :  9.76   Min.   :  0.0   Min.   : 0.000   Min.   :0  
##  1st Qu.:33.8   1st Qu.: 37.05   1st Qu.: 70.0   1st Qu.: 3.000   1st Qu.:0  
##  Median :46.4   Median : 56.42   Median :130.0   Median : 5.000   Median :0  
##  Mean   :44.0   Mean   : 56.37   Mean   :158.2   Mean   : 5.389   Mean   :0  
##  3rd Qu.:55.4   3rd Qu.: 75.84   3rd Qu.:290.0   3rd Qu.: 7.000   3rd Qu.:0  
##  Max.   :64.4   Max.   :100.00   Max.   :360.0   Max.   :23.000   Max.   :0  
##                                  NA's   :1                                   
##       alti            mslp           vsby             gust      
##  Min.   :29.62   Min.   :1002   Min.   : 0.120   Min.   :12.00  
##  1st Qu.:29.98   1st Qu.:1015   1st Qu.: 6.000   1st Qu.:18.00  
##  Median :30.14   Median :1021   Median :10.000   Median :22.00  
##  Mean   :30.14   Mean   :1021   Mean   : 8.777   Mean   :22.35  
##  3rd Qu.:30.31   3rd Qu.:1027   3rd Qu.:10.000   3rd Qu.:25.00  
##  Max.   :30.69   Max.   :1040   Max.   :15.000   Max.   :42.00  
##                  NA's   :926                     NA's   :1290   
##     skyc1              skyc2              skyc3            skyc4        
##  Length:1374        Length:1374        Length:1374        Mode:logical  
##  Class :character   Class :character   Class :character   NA's:1374     
##  Mode  :character   Mode  :character   Mode  :character                 
##                                                                         
##                                                                         
##                                                                         
##                                                                         
##      skyl1           skyl2           skyl3        skyl4        
##  Min.   :  200   Min.   :  500   Min.   : 4000   Mode:logical  
##  1st Qu.: 2000   1st Qu.: 2000   1st Qu.:20000   NA's:1374     
##  Median : 7000   Median : 7000   Median :20000                 
##  Mean   : 8290   Mean   : 9608   Mean   :17333                 
##  3rd Qu.:20000   3rd Qu.:20000   3rd Qu.:20000                 
##  Max.   :20000   Max.   :20000   Max.   :20000                 
##  NA's   :585     NA's   :1091    NA's   :1362                  
##    wxcodes          ice_accretion_1hr ice_accretion_3hr ice_accretion_6hr
##  Length:1374        Mode:logical      Mode:logical      Mode:logical     
##  Class :character   NA's:1374         NA's:1374         NA's:1374        
##  Mode  :character                                                        
##                                                                          
##                                                                          
##                                                                          
##                                                                          
##  peak_wind_gust peak_wind_drct peak_wind_time      feel      
##  Mode:logical   Mode:logical   Mode:logical   Min.   :27.99  
##  NA's:1374      NA's:1374      NA's:1374      1st Qu.:55.40  
##                                               Median :62.60  
##                                               Mean   :61.69  
##                                               3rd Qu.:69.80  
##                                               Max.   :94.14  
##                                                              
##     metar           snowdepth     
##  Length:1374        Mode:logical  
##  Class :character   NA's:1374     
##  Mode  :character                 
##                                   
##                                   
##                                   
## 
str(monterrey)
## tibble [1,374 × 30] (S3: tbl_df/tbl/data.frame)
##  $ station          : chr [1:1374] "MMMY" "MMMY" "MMMY" "MMMY" ...
##  $ valid            : POSIXct[1:1374], format: "2026-01-01 00:40:00" "2026-01-01 01:40:00" ...
##  $ tmpf             : num [1:1374] 57.2 55.4 53.6 51.8 51.8 50 46.4 42.8 44.6 44.6 ...
##  $ dwpf             : num [1:1374] 37.4 35.6 35.6 35.6 33.8 33.8 33.8 33.8 33.8 33.8 ...
##  $ relh             : num [1:1374] 47.4 47.1 50.4 53.8 50.1 ...
##  $ drct             : num [1:1374] 80 0 120 60 70 70 0 0 340 300 ...
##  $ sknt             : num [1:1374] 4 0 3 4 3 5 0 0 3 6 ...
##  $ p01i             : num [1:1374] 0 0 0 0 0 0 0 0 0 0 ...
##  $ alti             : num [1:1374] 30.2 30.2 30.2 30.2 30.2 ...
##  $ mslp             : num [1:1374] NA NA 1024 NA NA ...
##  $ vsby             : num [1:1374] 10 10 10 10 10 10 10 10 10 10 ...
##  $ gust             : num [1:1374] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc1            : chr [1:1374] "CLR" "CLR" "CLR" "CLR" ...
##  $ skyc2            : chr [1:1374] NA NA NA NA ...
##  $ skyc3            : chr [1:1374] NA NA NA NA ...
##  $ skyc4            : logi [1:1374] NA NA NA NA NA NA ...
##  $ skyl1            : num [1:1374] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl2            : num [1:1374] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl3            : num [1:1374] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl4            : logi [1:1374] NA NA NA NA NA NA ...
##  $ wxcodes          : chr [1:1374] NA NA NA NA ...
##  $ ice_accretion_1hr: logi [1:1374] NA NA NA NA NA NA ...
##  $ ice_accretion_3hr: logi [1:1374] NA NA NA NA NA NA ...
##  $ ice_accretion_6hr: logi [1:1374] NA NA NA NA NA NA ...
##  $ peak_wind_gust   : logi [1:1374] NA NA NA NA NA NA ...
##  $ peak_wind_drct   : logi [1:1374] NA NA NA NA NA NA ...
##  $ peak_wind_time   : logi [1:1374] NA NA NA NA NA NA ...
##  $ feel             : num [1:1374] 57.2 55.4 53.6 51.8 51.8 ...
##  $ metar            : chr [1:1374] "MMMY 010040Z 08004KT 10SM SKC 14/03 A3022 RMK ISOL CI" "MMMY 010140Z 00000KT 10SM SKC 13/02 A3022" "MMMY 010240Z 12003KT 10SM SKC 12/02 A3022 RMK SLP245 52004 993" "MMMY 010340Z 06004KT 10SM SKC 11/02 A3022" ...
##  $ snowdepth        : logi [1:1374] NA NA NA NA NA NA ...
#View(monterrey)

# Filtrar información del último mes
mty_ene_26 <- subset(monterrey, valid >= as.POSIXct("2026-01-01 00:40:00") & valid <= as.POSIXct("2026-02-01 23:41:00"))
head(mty_ene_26)
## # A tibble: 6 × 30
##   station valid                tmpf  dwpf  relh  drct  sknt  p01i  alti  mslp
##   <chr>   <dttm>              <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 MMMY    2026-01-01 06:43:00  46.4  33.8  61.3     0     0     0  30.2   NA 
## 2 MMMY    2026-01-01 07:52:00  42.8  33.8  70.3     0     0     0  30.2   NA 
## 3 MMMY    2026-01-01 08:44:00  44.6  33.8  65.6   340     3     0  30.2 1022.
## 4 MMMY    2026-01-01 09:40:00  44.6  33.8  65.6   300     6     0  30.2   NA 
## 5 MMMY    2026-01-01 10:40:00  42.8  33.8  70.3   280     8     0  30.2   NA 
## 6 MMMY    2026-01-01 11:43:00  42.8  33.8  70.3   280     9     0  30.2 1022.
## # ℹ 20 more variables: vsby <dbl>, gust <dbl>, skyc1 <chr>, skyc2 <chr>,
## #   skyc3 <chr>, skyc4 <lgl>, skyl1 <dbl>, skyl2 <dbl>, skyl3 <dbl>,
## #   skyl4 <lgl>, wxcodes <chr>, ice_accretion_1hr <lgl>,
## #   ice_accretion_3hr <lgl>, ice_accretion_6hr <lgl>, peak_wind_gust <lgl>,
## #   peak_wind_drct <lgl>, peak_wind_time <lgl>, feel <dbl>, metar <chr>,
## #   snowdepth <lgl>
# Ejercicio 1: Realizar una gráfica de barras de la temperatura promedio diario en agosto en Monterrey en °C.

#Promediar temperatura por día
library(dplyr)

temp_prom_diaria <- mty_ene_26 %>%
  mutate(fecha = as.Date(valid)) %>%   
  group_by(fecha) %>%                  
  summarise(tmpf = mean(tmpf, na.rm = TRUE))

#Transformar temperatura a grados Celsius
temp_prom_diaria <- temp_prom_diaria %>%
  mutate(tmpc = (tmpf - 32) * 5/9)

head(temp_prom_diaria)
## # A tibble: 6 × 3
##   fecha       tmpf  tmpc
##   <date>     <dbl> <dbl>
## 1 2026-01-01  59.3  15.2
## 2 2026-01-02  69.5  20.8
## 3 2026-01-03  72.9  22.7
## 4 2026-01-04  66.0  18.9
## 5 2026-01-05  68    20  
## 6 2026-01-06  68.6  20.3
#Gráfico
ggplot(data = temp_prom_diaria, aes(fecha, tmpc)) + geom_col() +
  labs(title = "Temperatura promedio diaria en Monterrey (enero 2026)", x = "Fecha",y = "Temperatura promedio (°C)")

LS0tDQp0aXRsZTogIkFTT1MiDQphdXRob3I6ICJFdmVseW4gUm9kcsOtZ3VleiBZdWRpY2hlIg0KZGF0ZTogIjIwMjYtMDItMjYiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogZGFya2x5DQotLS0NCg0KIVtdKGx1eWVscHJvZi5wbmcpDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiB5ZWxsb3c7Ij5JbnRyb2R1Y2Npw7NuPC9zcGFuPg0KSW5mb3JtYWNpw7NuIG9idGVuaWRhIGRlbCAqQXV0b21hdGVkIFN1cmZhY2UgT2JzZXJ2aW5nIFN5c3RlbSAoQVNPUykqIGRlIGxvcyBhZXJvcHVlcnRvcyBkZSB0b2RvIGVsIG11bmRvLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+SW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hczwvc3Bhbj4NCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoInJpZW0iKQ0KbGlicmFyeShyaWVtKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQojaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQpsaWJyYXJ5KGdncGxvdDIpDQojaW5zdGFsbC5wYWNrYWdlcygibHVicmlkYXRlIikNCmxpYnJhcnkobHVicmlkYXRlKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiB5ZWxsb3c7Ij5PYnRlbmVyIHkgZ3JhZmljYXIgbGEgaW5mb3JtYWNpw7NuPC9zcGFuPg0KYGBge3J9DQojIFBBU08gMS4gQnVzY2FyIGxhIHJlZCAocGHDrXMpIC0gRWplbXBsbzogTcOpeGljbywgeSBjb3BpYXIgQ09ERQ0KIyB2aWV3KHJpZW1fbmV0d29ya3MoKSkNCg0KIyBQQVNPIDIuIEJ1c2NhciBsYSBlc3RhY2nDs24gKGNpdWRhZCkgLSBFamVtcGxvOiBNb250ZXJyZXksIHkgY29waWFyIElEDQojdmlldyhyaWVtX3N0YXRpb25zKCJNWF9fQVNPUyIpKQ0KDQojIFBBU08gMy4gT2J0ZW5lciBpbmZvcm1hY2nDs24gZGUgbGEgZXN0YWNpw7NuDQptb250ZXJyZXkgPC0gcmllbV9tZWFzdXJlcygiTU1NWSIsIGRhdGVfc3RhcnQgPSAiMjAyNi0wMS0wMSIpDQoNCiMgQW7DoWxpc2lzIERlc2NyaXB0aXZvDQpzdW1tYXJ5KG1vbnRlcnJleSkNCnN0cihtb250ZXJyZXkpDQojVmlldyhtb250ZXJyZXkpDQoNCiMgRmlsdHJhciBpbmZvcm1hY2nDs24gZGVsIMO6bHRpbW8gbWVzDQptdHlfZW5lXzI2IDwtIHN1YnNldChtb250ZXJyZXksIHZhbGlkID49IGFzLlBPU0lYY3QoIjIwMjYtMDEtMDEgMDA6NDA6MDAiKSAmIHZhbGlkIDw9IGFzLlBPU0lYY3QoIjIwMjYtMDItMDEgMjM6NDE6MDAiKSkNCmhlYWQobXR5X2VuZV8yNikNCmBgYA0KDQpgYGB7cn0NCiMgRWplcmNpY2lvIDE6IFJlYWxpemFyIHVuYSBncsOhZmljYSBkZSBiYXJyYXMgZGUgbGEgdGVtcGVyYXR1cmEgcHJvbWVkaW8gZGlhcmlvIGVuIGFnb3N0byBlbiBNb250ZXJyZXkgZW4gwrBDLg0KDQojUHJvbWVkaWFyIHRlbXBlcmF0dXJhIHBvciBkw61hDQpsaWJyYXJ5KGRwbHlyKQ0KDQp0ZW1wX3Byb21fZGlhcmlhIDwtIG10eV9lbmVfMjYgJT4lDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUodmFsaWQpKSAlPiUgICANCiAgZ3JvdXBfYnkoZmVjaGEpICU+JSAgICAgICAgICAgICAgICAgIA0KICBzdW1tYXJpc2UodG1wZiA9IG1lYW4odG1wZiwgbmEucm0gPSBUUlVFKSkNCg0KI1RyYW5zZm9ybWFyIHRlbXBlcmF0dXJhIGEgZ3JhZG9zIENlbHNpdXMNCnRlbXBfcHJvbV9kaWFyaWEgPC0gdGVtcF9wcm9tX2RpYXJpYSAlPiUNCiAgbXV0YXRlKHRtcGMgPSAodG1wZiAtIDMyKSAqIDUvOSkNCg0KaGVhZCh0ZW1wX3Byb21fZGlhcmlhKQ0KDQojR3LDoWZpY28NCmdncGxvdChkYXRhID0gdGVtcF9wcm9tX2RpYXJpYSwgYWVzKGZlY2hhLCB0bXBjKSkgKyBnZW9tX2NvbCgpICsNCiAgbGFicyh0aXRsZSA9ICJUZW1wZXJhdHVyYSBwcm9tZWRpbyBkaWFyaWEgZW4gTW9udGVycmV5IChlbmVybyAyMDI2KSIsIHggPSAiRmVjaGEiLHkgPSAiVGVtcGVyYXR1cmEgcHJvbWVkaW8gKMKwQykiKQ0KDQpgYGANCg==