Médias em série temporal

Boa tarde pessoal!
Eu tenho uma base com uma série de dados horários de qualidade do ar e meteorologia, são 15 anos. Eu gostaria de fazer por exemplo, um gráfico com a média da temperatura de cada um dos 15 janeiros. No livro R for Data Science logo no início traz exemplos com a base “nycflights13”, porém nessa base sa datas estão separadas em colunas, ano, mês, dia etc. Eu tenho apenas uma coluna de data “yyyy-mm-dd hh:dd:ss”. A minha dúvida é se consigo usar as funções filter, arrange, select etc diretamente nessa coluna de data, ou terei que transformar essa coluna em várias colunas de valores inteiros, como na base “nycflights13”? Muito obrigado!

Oi Fernando, tudo bem?

Nesse caso eu recomendo usar o pacote lubridate para lidar com as datas. O melhor é converter para a classe/formato data.

Nesse exemplo abaixo tem formas de importar uma coluna no formato texto “yyyy-mm-dd hh:dd:ss” para um formato data, e também como extrair o mês, por exemplo, usando lubridate:

library(magrittr, include.only = "%>%")
library(ggplot2)


# criar um pequeno df de exemplo
df_exemplo <- tibble::tribble(
  ~data_hora, ~valor,
  "2020-02-14 12:32:00", 15,
  "2020-12-05 12:32:00", 10,
  "2021-09-24 15:23:00", 12
)

df_exemplo
#> # A tibble: 3 × 2
#>   data_hora           valor
#>   <chr>               <dbl>
#> 1 2020-02-14 12:32:00    15
#> 2 2020-12-05 12:32:00    10
#> 3 2021-09-24 15:23:00    12
# separar a coluna data_hora e transformar a coluna data em classe date
df_exemplo_data <- df_exemplo %>% 
  tidyr::separate(data_hora, into = c("data", "hora"), sep = " ") %>% 
  dplyr::mutate(data = readr::parse_date(data),
                # as linhas abaixo podem ser uteis pra voce
                # extrair o mes apenas
                mes_data = lubridate::floor_date(data, unit = "month"),
                mes_texto = lubridate::month(data))


df_exemplo_data 
#> # A tibble: 3 × 5
#>   data       hora     valor mes_data   mes_texto
#>   <date>     <chr>    <dbl> <date>         <dbl>
#> 1 2020-02-14 12:32:00    15 2020-02-01         2
#> 2 2020-12-05 12:32:00    10 2020-12-01        12
#> 3 2021-09-24 15:23:00    12 2021-09-01         9
# exemplo: o ggplot entende o tipo data
df_exemplo_data %>% 
  ggplot() +
  geom_line(aes(x = data, y = valor))

Created on 2021-09-24 by the reprex package (v2.0.1)

No exemplo abaixo eu extraio o mês, e calculo a média do volume armazenado por mês (usando esses dados: mananciais • mananciais)

# install.packages("devtools")
# instalar o pacote
devtools::install_github("beatrizmilz/mananciais")
#> Using github PAT from envvar GITHUB_PAT
#> Skipping install of 'mananciais' from a github remote, the SHA1 (b98df326) has not changed since last install.
#>   Use `force = TRUE` to force installation
library(magrittr, include.only = "%>%")


# carregar a base
mananciais <- mananciais::dados_mananciais() 


dplyr::glimpse(mananciais)
#> Rows: 48,960
#> Columns: 8
#> $ data                <date> 2021-09-24, 2021-09-24, 2021-09-24, 2021-09-24, 2…
#> $ sistema             <chr> "Cantareira", "Alto Tietê", "Guarapiranga", "Cotia…
#> $ volume_porcentagem  <dbl> 31.9, 41.2, 46.2, 51.9, 75.3, 38.8, 53.1, 32.2, 41…
#> $ volume_variacao     <dbl> -0.3, -0.1, -0.2, -0.3, 0.3, -0.2, 0.1, -0.2, -0.1…
#> $ volume_operacional  <dbl> 313.61332, 230.60565, 79.14035, 8.55704, 84.43669,…
#> $ pluviometria_dia    <dbl> 0.0, 0.1, 0.0, 0.0, 0.0, 0.4, 0.0, 0.0, 0.5, 0.2, …
#> $ pluviometria_mensal <dbl> 25.6, 15.8, 6.6, 12.6, 19.0, 59.6, 35.4, 25.6, 15.…
#> $ pluviometria_hist   <dbl> 83.2, 78.3, 77.0, 81.3, 93.9, 140.6, 114.0, 83.2, …
mananciais %>% 
  dplyr::select(data:volume_porcentagem) %>% 
  dplyr::filter(sistema == "Cantareira") %>%  
  dplyr::mutate(mes = lubridate::floor_date(data, unit = "month")) %>% 
  dplyr::group_by(mes) %>% 
  dplyr::summarise(media_volume = mean(volume_porcentagem))
#> # A tibble: 261 × 2
#>    mes        media_volume
#>    <date>            <dbl>
#>  1 2000-01-01         55.8
#>  2 2000-02-01         61.4
#>  3 2000-03-01         66.2
#>  4 2000-04-01         67.4
#>  5 2000-05-01         61.9
#>  6 2000-06-01         55.1
#>  7 2000-07-01         48.5
#>  8 2000-08-01         41.9
#>  9 2000-09-01         38.0
#> 10 2000-10-01         31.7
#> # … with 251 more rows

Created on 2021-09-24 by the reprex package (v2.0.1)

1 Curtida

Bea, muito boa resposta.
Poderia por favor explicar quando usar a função parse_date ?

1 Curtida

Oi Eduardo! As funções que começam com parse_ são úteis para extrair valores importantes e transformar em uma certa classe.

No caso do exemplo acima, a data estava armazenada como texto (chr), e é interessante que ela seja transformada em classe data (date) ! Para isso usamos a função parse_date() pra extrair os valores e transformar em classe date. Veja o exemplo abaixo:

library(magrittr)

# criar um pequeno df de exemplo
df_exemplo <- tibble::tribble(
  ~data_texto, 
  "2020-02-14", 
  "2020-12-05",
  "2021-09-24"
)

# veja que a classe da coluna data é chr, ou seja, texto
dplyr::glimpse(df_exemplo)
#> Rows: 3
#> Columns: 1
#> $ data_texto <chr> "2020-02-14", "2020-12-05", "2021-09-24"

df_exemplo %>% 
  dplyr::mutate(data = readr::parse_date(data_texto))
#> # A tibble: 3 × 2
#>   data_texto data      
#>   <chr>      <date>    
#> 1 2020-02-14 2020-02-14
#> 2 2020-12-05 2020-12-05
#> 3 2021-09-24 2021-09-24

Created on 2021-09-30 by the reprex package (v2.0.1)

E essa função também funciona com datas em outros formatos, como por exemplo o formato que usamos aqui: 15/02/1993

library(magrittr)

# criar um pequeno df de exemplo
df_exemplo <- tibble::tribble(
  ~data_texto, 
  "14/02/2020", 
  "05/12/2020",
  "24/09/2020"
)

# veja que a classe da coluna data é chr, ou seja, texto
dplyr::glimpse(df_exemplo)
#> Rows: 3
#> Columns: 1
#> $ data_texto <chr> "14/02/2020", "05/12/2020", "24/09/2020"

# só usar a função parse_date nesse caso nao vai funcionar
df_exemplo %>% 
  dplyr::mutate(data = readr::parse_date(data_texto))
#> Warning: 3 parsing failures.
#> row col   expected     actual
#>   1  -- date like  14/02/2020
#>   2  -- date like  05/12/2020
#>   3  -- date like  24/09/2020

#> # A tibble: 3 × 2
#>   data_texto data  
#>   <chr>      <date>
#> 1 14/02/2020 NA    
#> 2 05/12/2020 NA    
#> 3 24/09/2020 NA


# precisamos usar o argumento format, e ai funciona!

df_exemplo %>% 
  dplyr::mutate(data = readr::parse_date(data_texto, format = "%d/%m/%Y"))
#> # A tibble: 3 × 2
#>   data_texto data      
#>   <chr>      <date>    
#> 1 14/02/2020 2020-02-14
#> 2 05/12/2020 2020-12-05
#> 3 24/09/2020 2020-09-24

Created on 2021-09-30 by the reprex package (v2.0.1)

3 Curtidas

Consegui chegar no mesmo resultado que vc!
Muito obrigado @beatrizmilz!!!

1 Curtida

Muito obrigado @beatrizmilz