8 Trabalhando com datas

Datas são um caso a parte no R. Existe uma própria classe para objetos desse tipo, chamada Date, com D maiúsculo. O R lida com datas no formato AAAA-MM-DD (Ano, Mês e Dia).

Abaixo, definimos um vetor com datas

## [1] "2014-07-15" NA           "2019-12-31" NA
## [1] "Date"

Perceba que o R nativamente não aceita qualquer separador entre o ano, o mês e o dia, apenas o traço. O pacote lubridate, que faz parte da família tidyverse, possui uma versão mais generalizável para isso:

## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
## [1] "2014-07-15" "2018-03-20" "2019-12-31" "2017-05-11"

A propósito, dominar o pacote lubridate, que possui funções muito simples de usar, é a única coisa necessária para saber lidar com datas no R. Por isso, este capítulo se dedica a mostrar as principais funções do pacote.

8.1 Gerar um vetor sequencial de datas

Essa tarefa é feita usando uma função nativa do R chamada seq.Date(), que possui quatro argumentos principais, sendo que três deles precisam ser especificados.

## function (from, to, by, length.out = NULL, along.with = NULL, 
##     ...) 
## NULL
##  [1] "2020-01-01" "2020-02-01" "2020-03-01" "2020-04-01" "2020-05-01"
##  [6] "2020-06-01" "2020-07-01" "2020-08-01" "2020-09-01" "2020-10-01"
## [11] "2020-11-01" "2020-12-01"
##  [1] "2020-01-01" "2020-01-02" "2020-01-03" "2020-01-04" "2020-01-05"
##  [6] "2020-01-06" "2020-01-07" "2020-01-08" "2020-01-09" "2020-01-10"
## [11] "2020-01-11" "2020-01-12" "2020-01-13" "2020-01-14" "2020-01-15"
## [16] "2020-01-16" "2020-01-17" "2020-01-18" "2020-01-19" "2020-01-20"
## [1] "2020-01-01" "2020-01-04" "2020-01-07" "2020-01-10" "2020-01-13"
## [6] "2020-01-16" "2020-01-19"
## [1] "2020-01-01" "2020-01-08" "2020-01-15" "2020-01-22" "2020-01-29"
## [6] "2020-02-05" "2020-02-12"

8.2 ‘Parsear’ datas e horários

Para fazer o R converter (ou parsear na linguagem de programação) um string em data, basta usar as funções correspondentes do lubridate.

Por exemplo, no vetor de exemplo x, definido acima, as datas já estavam definidas no formato correto: AAAA-MM-DD. Aqui no Brasil usamos outro formato: DD/MM/AAAA. O lubridate possui uma função pronta para essa situação:

## [1] "2019-12-01" "2018-11-20" "1990-01-30" "2000-03-17"

Caso o vetor também contenha dados de horário, basta incluir o sufixo referente a hora, minuto e segundo:

## [1] "2019-09-30 14:51:39 UTC"
## [1] "2019-09-30 14:15:00 UTC"
## [1] "2019-09-30 15:00:00 UTC"

8.3 Extrair componentes de uma data

É possível extrair qualquer tipo de componente de uma data ou de um vetor de datas com o lubridate. Veja alguns exemplos:

## [1] "2019-12-01 13:51:15 UTC" "2018-11-20 00:00:00 UTC"
## [3] "1990-01-30 08:00:00 UTC" "2000-03-17 20:30:00 UTC"
## [1] 2019 2018 1990 2000
## [1] 12 11  1  3
## [1]  1 20 30 17
## [1] 48 47  5 11
## [1] dom ter ter sex
## Levels: dom < seg < ter < qua < qui < sex < sáb
## [1] 4 4 1 1
## [1] 13  0  8 20

8.4 Operações matemáticas com datas

Geralmente se está interessado em fazer três tipos de operações matemáticas com datas:

  • Adicionar uma quantidade N de dias/meses/anos/etc em uma data:
## [1] "2019-12-08 13:51:15 UTC" "2018-11-27 00:00:00 UTC"
## [3] "1990-02-06 08:00:00 UTC" "2000-03-24 20:30:00 UTC"
## [1] "2020-02-29 13:51:15 UTC" "2019-02-18 00:00:00 UTC"
## [3] "1990-04-30 08:00:00 UTC" "2000-06-15 20:30:00 UTC"
## [1] "2020-11-30 19:51:15 UTC" "2019-11-20 06:00:00 UTC"
## [3] "1991-01-30 14:00:00 UTC" "2001-03-18 02:30:00 UTC"
  • Calcular a diferença de tempo entre duas datas:

No R, subtrair datas segue a mesma sintaxe de subtrair números:

## Time difference of 9061.875 days

Por padrão, o R retorna a diferença em dias, mas em um objeto de classe difftime.

## [1] "difftime"

Recomenda-se então converter o output para a classe numeric:

## [1] 9061.875

Caso se deseje calcular essa diferença em outras unidades de tempo, como meses ou semanas, basta fazer a divisão correspondente:

## [1] 1294.554
## [1] 302.0625
## [1] 24.82705
  • Arredondar datas:

Para arredondar uma data, por exemplo, retornar o primeiro ou último dia da semana/mês/trimestre/etc de uma data de referência, usa-se as funções ceiling_date() (arredondar para cima) e floor_date() (para baixo):

## [1] "2019-12-01 UTC" "2018-11-18 UTC" "1990-01-28 UTC" "2000-03-12 UTC"
## [1] "2019-12-31 23:59:59 UTC" "2018-11-30 23:59:59 UTC"
## [3] "1990-01-31 23:59:59 UTC" "2000-03-31 23:59:59 UTC"
## [1] "2019-12-01 13:00:00 UTC" "2018-11-20 00:00:00 UTC"
## [3] "1990-01-30 08:00:00 UTC" "2000-03-17 20:00:00 UTC"