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
morelia <- riem_measures("MMMM", date_start = "2026-01-01",
                                 date_end   = "2026-01-31")

# Análisis Descriptivo
summary(morelia)
##    station              valid                          tmpf      
##  Length:839         Min.   :2026-01-01 00:40:00   Min.   :33.80  
##  Class :character   1st Qu.:2026-01-08 12:18:30   1st Qu.:46.40  
##  Mode  :character   Median :2026-01-16 05:46:00   Median :55.40  
##                     Mean   :2026-01-16 01:40:28   Mean   :56.74  
##                     3rd Qu.:2026-01-23 14:54:30   3rd Qu.:66.20  
##                     Max.   :2026-01-30 23:44:00   Max.   :82.40  
##                                                                  
##       dwpf            relh             drct            sknt             p01i  
##  Min.   :32.00   Min.   : 18.45   Min.   :  0.0   Min.   : 0.000   Min.   :0  
##  1st Qu.:41.00   1st Qu.: 47.72   1st Qu.:  0.0   1st Qu.: 0.000   1st Qu.:0  
##  Median :44.60   Median : 71.26   Median :140.0   Median : 3.000   Median :0  
##  Mean   :44.24   Mean   : 69.04   Mean   :135.2   Mean   : 2.669   Mean   :0  
##  3rd Qu.:48.20   3rd Qu.: 93.40   3rd Qu.:240.0   3rd Qu.: 4.000   3rd Qu.:0  
##  Max.   :55.40   Max.   :100.00   Max.   :360.0   Max.   :15.000   Max.   :0  
##                                                                               
##       alti            mslp           vsby           gust        skyc1          
##  Min.   :30.10   Min.   :1007   Min.   :0.25   Min.   :12    Length:839        
##  1st Qu.:30.22   1st Qu.:1012   1st Qu.:6.00   1st Qu.:12    Class :character  
##  Median :30.27   Median :1014   Median :7.00   Median :12    Mode  :character  
##  Mean   :30.27   Mean   :1014   Mean   :6.73   Mean   :12                      
##  3rd Qu.:30.31   3rd Qu.:1017   3rd Qu.:8.00   3rd Qu.:12                      
##  Max.   :30.47   Max.   :1023   Max.   :8.00   Max.   :12                      
##                  NA's   :599                   NA's   :838                     
##     skyc2              skyc3            skyc4             skyl1      
##  Length:839         Length:839         Mode:logical   Min.   :  500  
##  Class :character   Class :character   NA's:839       1st Qu.: 3000  
##  Mode  :character   Mode  :character                  Median : 7000  
##                                                       Mean   :13661  
##                                                       3rd Qu.:28000  
##                                                       Max.   :28000  
##                                                       NA's   :320    
##      skyl2           skyl3        skyl4           wxcodes         
##  Min.   : 1500   Min.   :25000   Mode:logical   Length:839        
##  1st Qu.: 9000   1st Qu.:28000   NA's:839       Class :character  
##  Median :10000   Median :28000                  Mode  :character  
##  Mean   :17738   Mean   :27710                                    
##  3rd Qu.:28000   3rd Qu.:28000                                    
##  Max.   :28000   Max.   :28000                                    
##  NA's   :650     NA's   :808                                      
##  ice_accretion_1hr ice_accretion_3hr ice_accretion_6hr peak_wind_gust
##  Mode:logical      Mode:logical      Mode:logical      Mode:logical  
##  NA's:839          NA's:839          NA's:839          NA's:839      
##                                                                      
##                                                                      
##                                                                      
##                                                                      
##                                                                      
##  peak_wind_drct peak_wind_time      feel          metar          
##  Mode:logical   Mode:logical   Min.   :32.80   Length:839        
##  NA's:839       NA's:839       1st Qu.:45.15   Class :character  
##                                Median :55.40   Mode  :character  
##                                Mean   :56.47                     
##                                3rd Qu.:66.20                     
##                                Max.   :80.64                     
##                                                                  
##  snowdepth     
##  Mode:logical  
##  NA's:839      
##                
##                
##                
##                
## 
str(morelia)
## tibble [839 × 30] (S3: tbl_df/tbl/data.frame)
##  $ station          : chr [1:839] "MMMM" "MMMM" "MMMM" "MMMM" ...
##  $ valid            : POSIXct[1:839], format: "2026-01-01 00:40:00" "2026-01-01 01:40:00" ...
##  $ tmpf             : num [1:839] 60.8 55.4 55.4 48.2 46.4 42.8 42.8 41 41 39.2 ...
##  $ dwpf             : num [1:839] 46.4 44.6 44.6 42.8 42.8 41 41 41 41 39.2 ...
##  $ relh             : num [1:839] 59 66.9 66.9 81.5 87.2 ...
##  $ drct             : num [1:839] 340 0 0 0 110 0 180 0 0 0 ...
##  $ sknt             : num [1:839] 3 0 0 0 3 0 3 0 0 0 ...
##  $ p01i             : num [1:839] 0 0 0 0 0 0 0 0 0 0 ...
##  $ alti             : num [1:839] 30.3 30.3 30.3 30.4 30.4 ...
##  $ mslp             : num [1:839] NA NA 1018 NA NA ...
##  $ vsby             : num [1:839] 7 7 7 7 7 7 6 6 6 6 ...
##  $ gust             : num [1:839] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc1            : chr [1:839] "FEW" "FEW" "CLR" "CLR" ...
##  $ skyc2            : chr [1:839] "FEW" NA NA NA ...
##  $ skyc3            : chr [1:839] NA NA NA NA ...
##  $ skyc4            : logi [1:839] NA NA NA NA NA NA ...
##  $ skyl1            : num [1:839] 3000 28000 NA NA NA NA NA NA NA NA ...
##  $ skyl2            : num [1:839] 28000 NA NA NA NA NA NA NA NA NA ...
##  $ skyl3            : num [1:839] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl4            : logi [1:839] NA NA NA NA NA NA ...
##  $ wxcodes          : chr [1:839] NA NA NA NA ...
##  $ ice_accretion_1hr: logi [1:839] NA NA NA NA NA NA ...
##  $ ice_accretion_3hr: logi [1:839] NA NA NA NA NA NA ...
##  $ ice_accretion_6hr: logi [1:839] NA NA NA NA NA NA ...
##  $ peak_wind_gust   : logi [1:839] NA NA NA NA NA NA ...
##  $ peak_wind_drct   : logi [1:839] NA NA NA NA NA NA ...
##  $ peak_wind_time   : logi [1:839] NA NA NA NA NA NA ...
##  $ feel             : num [1:839] 60.8 55.4 55.4 48.2 45.1 ...
##  $ metar            : chr [1:839] "MMMM 010040Z 34003KT 7SM FEW030 FEW280 16/08 A3029 RMK 8/502 HZY" "MMMM 010140Z 00000KT 7SM FEW280 13/07 A3032 RMK 8/002 HZY" "MMMM 010240Z 00000KT 7SM SKC 13/07 A3034 RMK SLP178 52008 951 HZY CI" "MMMM 010340Z 00000KT 7SM SKC 09/06 A3035 RMK HZY CI" ...
##  $ snowdepth        : logi [1:839] NA NA NA NA NA NA ...
# Filtrar información del último mes
mrl_ene_26 <- subset(morelia, valid >= as.POSIXct("2026-01-01 00:00") & valid <= as.POSIXct("2026-01-31 23:59"))

# Ejercicio 1: Realizar una gráfica de barras de la temperatura promedio diario del mes que hayan datos en Morelia en °C.

Generar el gráfico

#convertir F a C
mrl_ene_26$temp_c <- (mrl_ene_26$tmpf - 32) * 5/9

#Obtener promedio
mrl_ene_26$fecha <- as.Date(mrl_ene_26$valid)

promedio_diario <- aggregate(temp_c ~ fecha,
                             data = mrl_ene_26,
                             FUN = mean,
                             na.rm = TRUE)

#Gráfica de barras (Base R)
barplot(promedio_diario$temp_c,
        names.arg = promedio_diario$fecha,
        col = "orange",
        main = "Temperatura Promedio Diaria - Enero 2026\nMorelia (°C)",
        xlab = "Fecha",
        ylab = "Temperatura Promedio (°C)",
        las = 2)

Conclusiones

  • El mes de enero fue frio en su mayoria en la ciudad de Morelia

  • Los dias con temperaturas mas bajas son el 13, 12, 19 y 18.

  • El dia más calido fue el 4 de enero

  • Ningun dia supero los 16 C en promedio durante el mes de enero.

LS0tCnRpdGxlOiAiQXNvcyIKYXV0aG9yOiAiSnVuaW9yIE1lZGluYSIKZGF0ZTogIjIwMjYtMDItMjYiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogZGFya2x5Ci0tLQoKIVtdKGh0dHBzOi8vaW1hZ2VzLnRydmwtbWVkaWEuY29tL3BsYWNlLzYxMTM2NDAvMDMxNzliYzEtNmVmZS00OWVkLTgyMGItOGFjZWZjNDE0ZjAzLmpwZykKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ij5JbnRyb2R1Y2Npw7NuPC9zcGFuPgpJbmZvcm1hY2nDs24gb2J0ZW5pZGEgZGVsICpBdXRvbWF0ZWQgU3VyZmFjZSBPYnNlcnZpbmcgU3lzdGVtIChBU09TKSogZGUgbG9zIGFlcm9wdWVydG9zIGRlIHRvZG8gZWwgbXVuZG8uCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+SW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hczwvc3Bhbj4KYGBge3J9CiAjaW5zdGFsbC5wYWNrYWdlcygicmllbSIpCmxpYnJhcnkocmllbSkKICNpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKICNpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKbGlicmFyeShnZ3Bsb3QyKQogI2luc3RhbGwucGFja2FnZXMoImx1YnJpZGF0ZSIpCmxpYnJhcnkobHVicmlkYXRlKQpgYGAKCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ij5PYnRlbmVyIHkgZ3JhZmljYXIgbGEgaW5mb3JtYWNpw7NuPC9zcGFuPgpgYGB7cn0KIyBQQVNPIDEuIEJ1c2NhciBsYSByZWQgKHBhw61zKSAtIEVqZW1wbG86IE3DqXhpY28sIHkgY29waWFyIENPREUKIHZpZXcocmllbV9uZXR3b3JrcygpKQoKIyBQQVNPIDIuIEJ1c2NhciBsYSBlc3RhY2nDs24gKGNpdWRhZCkgLSBFamVtcGxvOiBNb250ZXJyZXksIHkgY29waWFyIElECiB2aWV3KHJpZW1fc3RhdGlvbnMoIk1YX19BU09TIikpCgojIFBBU08gMy4gT2J0ZW5lciBpbmZvcm1hY2nDs24gZGUgbGEgZXN0YWNpw7NuCm1vcmVsaWEgPC0gcmllbV9tZWFzdXJlcygiTU1NTSIsIGRhdGVfc3RhcnQgPSAiMjAyNi0wMS0wMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfZW5kICAgPSAiMjAyNi0wMS0zMSIpCgojIEFuw6FsaXNpcyBEZXNjcmlwdGl2bwpzdW1tYXJ5KG1vcmVsaWEpCnN0cihtb3JlbGlhKQoKIyBGaWx0cmFyIGluZm9ybWFjacOzbiBkZWwgw7psdGltbyBtZXMKbXJsX2VuZV8yNiA8LSBzdWJzZXQobW9yZWxpYSwgdmFsaWQgPj0gYXMuUE9TSVhjdCgiMjAyNi0wMS0wMSAwMDowMCIpICYgdmFsaWQgPD0gYXMuUE9TSVhjdCgiMjAyNi0wMS0zMSAyMzo1OSIpKQoKIyBFamVyY2ljaW8gMTogUmVhbGl6YXIgdW5hIGdyw6FmaWNhIGRlIGJhcnJhcyBkZSBsYSB0ZW1wZXJhdHVyYSBwcm9tZWRpbyBkaWFyaW8gZGVsIG1lcyBxdWUgaGF5YW4gZGF0b3MgZW4gTW9yZWxpYSBlbiDCsEMuCgpgYGAKCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+R2VuZXJhciBlbCBncsOhZmljbzwvc3Bhbj4KCmBgYHtyfQojY29udmVydGlyIEYgYSBDCm1ybF9lbmVfMjYkdGVtcF9jIDwtIChtcmxfZW5lXzI2JHRtcGYgLSAzMikgKiA1LzkKCiNPYnRlbmVyIHByb21lZGlvCm1ybF9lbmVfMjYkZmVjaGEgPC0gYXMuRGF0ZShtcmxfZW5lXzI2JHZhbGlkKQoKcHJvbWVkaW9fZGlhcmlvIDwtIGFnZ3JlZ2F0ZSh0ZW1wX2MgfiBmZWNoYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbXJsX2VuZV8yNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVU4gPSBtZWFuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtID0gVFJVRSkKCiNHcsOhZmljYSBkZSBiYXJyYXMgKEJhc2UgUikKYmFycGxvdChwcm9tZWRpb19kaWFyaW8kdGVtcF9jLAogICAgICAgIG5hbWVzLmFyZyA9IHByb21lZGlvX2RpYXJpbyRmZWNoYSwKICAgICAgICBjb2wgPSAib3JhbmdlIiwKICAgICAgICBtYWluID0gIlRlbXBlcmF0dXJhIFByb21lZGlvIERpYXJpYSAtIEVuZXJvIDIwMjZcbk1vcmVsaWEgKMKwQykiLAogICAgICAgIHhsYWIgPSAiRmVjaGEiLAogICAgICAgIHlsYWIgPSAiVGVtcGVyYXR1cmEgUHJvbWVkaW8gKMKwQykiLAogICAgICAgIGxhcyA9IDIpCmBgYAoKCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+Q29uY2x1c2lvbmVzPC9zcGFuPgogCgotIEVsIG1lcyBkZSBlbmVybyBmdWUgZnJpbyBlbiBzdSBtYXlvcmlhIGVuIGxhIGNpdWRhZCBkZSBNb3JlbGlhCgotIExvcyBkaWFzIGNvbiB0ZW1wZXJhdHVyYXMgbWFzIGJhamFzIHNvbiBlbCAxMywgMTIsIDE5IHkgMTguCgotIEVsIGRpYSBtw6FzIGNhbGlkbyBmdWUgZWwgNCBkZSBlbmVybwoKLSBOaW5ndW4gZGlhIHN1cGVybyBsb3MgMTYgQyBlbiBwcm9tZWRpbyBkdXJhbnRlIGVsIG1lcyBkZSBlbmVyby4gCg==