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
TOLUCA <- riem_measures("MMTO", date_start="2025-01-01")

# Análisis Descriptivo
summary(TOLUCA)
##    station              valid                          tmpf      
##  Length:11545       Min.   :2025-01-01 00:43:00   Min.   :28.40  
##  Class :character   1st Qu.:2025-04-20 01:41:00   1st Qu.:50.00  
##  Mode  :character   Median :2025-08-03 04:45:00   Median :55.40  
##                     Mean   :2025-08-02 19:04:05   Mean   :56.16  
##                     3rd Qu.:2025-11-18 13:26:00   3rd Qu.:64.40  
##                     Max.   :2026-02-25 23:53:00   Max.   :82.40  
##                                                                  
##       dwpf            relh             drct            sknt             p01i  
##  Min.   :-4.00   Min.   :  4.76   Min.   :  0.0   Min.   : 0.000   Min.   :0  
##  1st Qu.:37.40   1st Qu.: 49.12   1st Qu.:  0.0   1st Qu.: 0.000   1st Qu.:0  
##  Median :44.60   Median : 71.45   Median :120.0   Median : 3.000   Median :0  
##  Mean   :42.98   Mean   : 67.39   Mean   :129.8   Mean   : 4.238   Mean   :0  
##  3rd Qu.:50.00   3rd Qu.: 87.65   3rd Qu.:230.0   3rd Qu.: 6.000   3rd Qu.:0  
##  Max.   :62.60   Max.   :100.00   Max.   :360.0   Max.   :69.000   Max.   :0  
##                                   NA's   :381     NA's   :381                 
##       alti            mslp             vsby          gust        
##  Min.   :30.11   Min.   : 999.9   Min.   : 0.120   Mode:logical  
##  1st Qu.:30.35   1st Qu.:1008.9   1st Qu.: 5.000   NA's:11545    
##  Median :30.40   Median :1011.3   Median : 6.000                 
##  Mean   :30.39   Mean   :1012.0   Mean   : 6.129                 
##  3rd Qu.:30.44   3rd Qu.:1014.0   3rd Qu.: 8.000                 
##  Max.   :30.60   Max.   :1107.7   Max.   :12.000                 
##                  NA's   :8201                                    
##     skyc1              skyc2              skyc3              skyc4          
##  Length:11545       Length:11545       Length:11545       Length:11545      
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##      skyl1           skyl2           skyl3           skyl4      
##  Min.   :  100   Min.   :  800   Min.   : 7000   Min.   :20000  
##  1st Qu.: 2000   1st Qu.: 7000   1st Qu.:20000   1st Qu.:22000  
##  Median : 2000   Median : 8000   Median :20000   Median :23500  
##  Mean   : 4211   Mean   :10330   Mean   :18783   Mean   :23200  
##  3rd Qu.: 3000   3rd Qu.:10000   3rd Qu.:20000   3rd Qu.:25000  
##  Max.   :25000   Max.   :25000   Max.   :40000   Max.   :25000  
##  NA's   :3352    NA's   :7446    NA's   :10470   NA's   :11535  
##    wxcodes          ice_accretion_1hr ice_accretion_3hr ice_accretion_6hr
##  Length:11545       Mode:logical      Mode:logical      Mode:logical     
##  Class :character   NA's:11545        NA's:11545        NA's:11545       
##  Mode  :character                                                        
##                                                                          
##                                                                          
##                                                                          
##                                                                          
##  peak_wind_gust peak_wind_drct peak_wind_time      feel      
##  Mode:logical   Mode:logical   Mode:logical   Min.   :26.40  
##  NA's:11545     NA's:11545     NA's:11545     1st Qu.:50.00  
##                                               Median :55.40  
##                                               Mean   :56.09  
##                                               3rd Qu.:64.40  
##                                               Max.   :80.29  
##                                               NA's   :105    
##     metar           snowdepth     
##  Length:11545       Mode:logical  
##  Class :character   NA's:11545    
##  Mode  :character                 
##                                   
##                                   
##                                   
## 
str(TOLUCA)
## tibble [11,545 × 30] (S3: tbl_df/tbl/data.frame)
##  $ station          : chr [1:11545] "MMTO" "MMTO" "MMTO" "MMTO" ...
##  $ valid            : POSIXct[1:11545], format: "2025-01-01 00:43:00" "2025-01-01 01:40:00" ...
##  $ tmpf             : num [1:11545] 59 55.4 48.2 51.8 48.2 48.2 42.8 41 41 37.4 ...
##  $ dwpf             : num [1:11545] 37.4 35.6 28.4 24.8 24.8 23 26.6 28.4 32 28.4 ...
##  $ relh             : num [1:11545] 44.5 47.2 46 34.7 39.7 ...
##  $ drct             : num [1:11545] 130 0 80 60 0 90 0 0 0 0 ...
##  $ sknt             : num [1:11545] 5 0 4 5 0 3 0 0 0 0 ...
##  $ p01i             : num [1:11545] 0 0 0 0 0 0 0 0 0 0 ...
##  $ alti             : num [1:11545] 30.3 30.4 30.4 30.4 30.4 ...
##  $ mslp             : num [1:11545] NA NA 1019 NA NA ...
##  $ vsby             : num [1:11545] 8 8 8 8 8 8 6 7 2 2 ...
##  $ gust             : logi [1:11545] NA NA NA NA NA NA ...
##  $ skyc1            : chr [1:11545] "SCT" "SCT" "SCT" "BKN" ...
##  $ skyc2            : chr [1:11545] NA NA NA NA ...
##  $ skyc3            : chr [1:11545] NA NA NA NA ...
##  $ skyc4            : chr [1:11545] NA NA NA NA ...
##  $ skyl1            : num [1:11545] 20000 20000 20000 20000 20000 NA NA NA NA NA ...
##  $ skyl2            : num [1:11545] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl3            : num [1:11545] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl4            : num [1:11545] NA NA NA NA NA NA NA NA NA NA ...
##  $ wxcodes          : chr [1:11545] NA NA NA NA ...
##  $ ice_accretion_1hr: logi [1:11545] NA NA NA NA NA NA ...
##  $ ice_accretion_3hr: logi [1:11545] NA NA NA NA NA NA ...
##  $ ice_accretion_6hr: logi [1:11545] NA NA NA NA NA NA ...
##  $ peak_wind_gust   : logi [1:11545] NA NA NA NA NA NA ...
##  $ peak_wind_drct   : logi [1:11545] NA NA NA NA NA NA ...
##  $ peak_wind_time   : logi [1:11545] NA NA NA NA NA NA ...
##  $ feel             : num [1:11545] 59 55.4 46.3 51.8 48.2 ...
##  $ metar            : chr [1:11545] "MMTO 010043Z 13005KT 8SM SCT200 15/03 A3034 RMK 8/008" "MMTO 010140Z 00000KT 8SM SCT200 13/02 A3036 RMK 8/008" "MMTO 010243Z 08004KT 8SM SCT200 09/M02 A3038 RMK SLP191 52024 927 8/008" "MMTO 010348Z 06005KT 8SM BKN200 11/M04 A3040 RMK 8/008" ...
##  $ snowdepth        : logi [1:11545] NA NA NA NA NA NA ...
# Filtrar información del último mes
tol_ene_26 <- subset(TOLUCA, valid >= as.POSIXct("2025-01-01 00:00") & valid <= as.POSIXct("2025-01-31 23:59"))

Ejercicio Práctico

# Convertir a Celsius
tol_ene_26 <- tol_ene_26 %>%
  mutate(
    tmpc = (tmpf - 32) * 5/9,
    fecha = as.Date(valid)
  )

# Calcular promedio diario
promedio_diario <- tol_ene_26 %>%
  group_by(fecha) %>%
  summarise(temp_promedio = mean(tmpc, na.rm = TRUE))

# Gráfica de barras en rosa
ggplot(promedio_diario, aes(x = fecha, y = temp_promedio)) +
  geom_col(fill = "pink") +
  labs(
    title = "Temperatura Promedio Diaria en Toluca - Enero 2025",
    x = "Fecha",
    y = "Temperatura Promedio (°C)"
  ) +
  theme_minimal()

LS0tDQp0aXRsZTogIkFTT1MiDQphdXRob3I6ICJIZWxlbmEgUmFtw6xyZXogR2lsZXMiDQpkYXRlOiAiMjYtMDItMjYiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogZGFya2x5DQotLS0NCg0KDQohW10oaHR0cHM6Ly9lbmNyeXB0ZWQtdGJuMC5nc3RhdGljLmNvbS9pbWFnZXM/cT10Ym46QU5kOUdjU0NaQXJKUHpxU3otdnRwTXl3LVBIWmNDa1VHelY5V2JjV2RnJnMpDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiB5ZWxsb3c7Ij5JbnRyb2R1Y2Npw7NuPC9zcGFuPg0KSW5mb3JtYWNpw7NuIG9idGVuaWRhIGRlbCAqQXV0b21hdGVkIFN1cmZhY2UgT2JzZXJ2aW5nIFN5c3RlbSAoQVNPUykqIGRlIGxvcyBhZXJvcHVlcnRvcyBkZSB0b2RvIGVsIG11bmRvLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+SW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hczwvc3Bhbj4NCmBgYHtyfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJyaWVtIikNCmxpYnJhcnkocmllbSkNCiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCmxpYnJhcnkoZ2dwbG90MikNCiMgaW5zdGFsbC5wYWNrYWdlcygibHVicmlkYXRlIikNCmxpYnJhcnkobHVicmlkYXRlKQ0KYGBgDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiB5ZWxsb3c7Ij5PYnRlbmVyIHkgZ3JhZmljYXIgbGEgaW5mb3JtYWNpw7NuPC9zcGFuPg0KYGBge3J9DQojIFBBU08gMS4gQnVzY2FyIGxhIHJlZCAocGHDrXMpIC0gRWplbXBsbzogTcOpeGljbywgeSBjb3BpYXIgQ09ERQ0KIyB2aWV3KHJpZW1fbmV0d29ya3MoKSkNCg0KIyBQQVNPIDIuIEJ1c2NhciBsYSBlc3RhY2nDs24gKGNpdWRhZCkgLSBFamVtcGxvOiBNb250ZXJyZXksIHkgY29waWFyIElEDQp2aWV3KHJpZW1fc3RhdGlvbnMoIk1YX19BU09TIikpDQoNCiMgUEFTTyAzLiBPYnRlbmVyIGluZm9ybWFjacOzbiBkZSBsYSBlc3RhY2nDs24NClRPTFVDQSA8LSByaWVtX21lYXN1cmVzKCJNTVRPIiwgZGF0ZV9zdGFydD0iMjAyNS0wMS0wMSIpDQoNCiMgQW7DoWxpc2lzIERlc2NyaXB0aXZvDQpzdW1tYXJ5KFRPTFVDQSkNCnN0cihUT0xVQ0EpDQoNCiMgRmlsdHJhciBpbmZvcm1hY2nDs24gZGVsIMO6bHRpbW8gbWVzDQp0b2xfZW5lXzI2IDwtIHN1YnNldChUT0xVQ0EsIHZhbGlkID49IGFzLlBPU0lYY3QoIjIwMjUtMDEtMDEgMDA6MDAiKSAmIHZhbGlkIDw9IGFzLlBPU0lYY3QoIjIwMjUtMDEtMzEgMjM6NTkiKSkNCg0KYGBgDQoNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHllbGxvdzsiPkVqZXJjaWNpbyBQcsOhY3RpY288L3NwYW4+DQoNCmBgYHtyfQ0KIyBDb252ZXJ0aXIgYSBDZWxzaXVzDQp0b2xfZW5lXzI2IDwtIHRvbF9lbmVfMjYgJT4lDQogIG11dGF0ZSgNCiAgICB0bXBjID0gKHRtcGYgLSAzMikgKiA1LzksDQogICAgZmVjaGEgPSBhcy5EYXRlKHZhbGlkKQ0KICApDQoNCiMgQ2FsY3VsYXIgcHJvbWVkaW8gZGlhcmlvDQpwcm9tZWRpb19kaWFyaW8gPC0gdG9sX2VuZV8yNiAlPiUNCiAgZ3JvdXBfYnkoZmVjaGEpICU+JQ0KICBzdW1tYXJpc2UodGVtcF9wcm9tZWRpbyA9IG1lYW4odG1wYywgbmEucm0gPSBUUlVFKSkNCg0KIyBHcsOhZmljYSBkZSBiYXJyYXMgZW4gcm9zYQ0KZ2dwbG90KHByb21lZGlvX2RpYXJpbywgYWVzKHggPSBmZWNoYSwgeSA9IHRlbXBfcHJvbWVkaW8pKSArDQogIGdlb21fY29sKGZpbGwgPSAicGluayIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJUZW1wZXJhdHVyYSBQcm9tZWRpbyBEaWFyaWEgZW4gVG9sdWNhIC0gRW5lcm8gMjAyNSIsDQogICAgeCA9ICJGZWNoYSIsDQogICAgeSA9ICJUZW1wZXJhdHVyYSBQcm9tZWRpbyAowrBDKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg==