Datas

Introdução

Trabalhar com datas no R pode ser uma chateação. As funções do R base são, em geral, contraintuitivas e podem mudar de acordo com o tipo do objeto que você está usando. Além disso, características como fusos horários, anos bissextos, horários de verão, entre outras, podem não estar bem especificadas pelos métodos criados ou nem mesmo sendo levadas em conta.

O pacote lubridate, criado por Garrett Grolemund e Hadley Wickham, lida com esses problemas, fazendo o trabalho com datas ser muito mais fácil.

Para instalar, siga uma das opções abaixo:

install.packages(“tidyverse”) install.packages(“lubridate”) devtools::install_github(“tidyverse/lubridate”) install.packages(“devtools”)

Para carregar o pacote, basta rodar

library(lubridate)
## 
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
## 
##     date
library(tidyverse)
## ── Attaching packages ────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.2.1     ✔ purrr   0.3.2
## ✔ tibble  2.1.3     ✔ dplyr   0.8.3
## ✔ tidyr   0.8.2     ✔ stringr 1.4.0
## ✔ readr   1.3.1     ✔ forcats 0.4.0
## ── Conflicts ───────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ lubridate::as.difftime() masks base::as.difftime()
## ✖ lubridate::date()        masks base::date()
## ✖ dplyr::filter()          masks stats::filter()
## ✖ lubridate::intersect()   masks base::intersect()
## ✖ dplyr::lag()             masks stats::lag()
## ✖ lubridate::setdiff()     masks base::setdiff()
## ✖ lubridate::union()       masks base::union()

Nesta seção, falaremos sobre:

transformar e extrair datas; algumas funções úteis para trabalhar com datas; trabalhar com fusos horários; e operações aritméticas com datas

A classe “date”

Datas no R são tratadas como um tipo especial de objeto, com classe date. Há várias formas de criar objetos dessa classe:

data_string <- "21-10-2015"
class(data_string)
## [1] "character"
data_date <- date(data_string)

class(data_date)
## [1] "Date"
data_date
## [1] "0021-10-20"
data_mdy <- dmy(data_string)
class(data_mdy)
## [1] "Date"
data_mdy
## [1] "2015-10-21"

Veja que as funções date() e as_date() converteram a string para data, mas não devolveram o valor esperado. A função dmy() resolve esse problema estabelecendo explicitamente a ordem dia-mês-ano. Existem funções para todas as ordens possíveis: dmy(), mdy(), myd(), ymd(), ydm() etc.

As funções date() e as_date() assumem que a ordem segue o padrão da língua inglesa: ano-mês-dia (ymd).

date("2015-10-21")
## [1] "2015-10-21"
as_date("2015-10-21")
## [1] "2015-10-21"

Uma grande facilidade que essas funções trazem é poder criar objetos com classe date a partir de números e strings em diversos formatos.

dmy(21102015)
## [1] "2015-10-21"
dmy("21102015")
## [1] "2015-10-21"
dmy("21/10/2015")
## [1] "2015-10-21"
dmy("21.10.2015")
## [1] "2015-10-21"

Se além da data você precisar especificar o horário, basta usar as funções do tipo ymd_h(), ymd_hm(), ymd_hms(), sendo que também há uma função para cada formato de dia-mês-ano.

ymd_hms(20151021165411)
## [1] "2015-10-21 16:54:11 UTC"

Funções úteis

O lubridate traz diversas funções para extrair os componentes de um objeto da classe date.

second() - extrai os segundos. minute() - extrai os minutos. hour() - extrai a hora. wday() - extrai o dia da semana. mday() - extrai o dia do mês. month() - extrai o mês. year() - extrai o ano.

Os nomes são tão óbvios que a explicação do que cada função faz é praticamente desnecessária

dia <- ymd_hms(19890729030142)
dia
## [1] "1989-07-29 03:01:42 UTC"
second(dia)
## [1] 42
day(dia)
## [1] 29
month(dia)
## [1] 7
year(dia)
## [1] 1989
wday(dia)
## [1] 7
wday(dia, label = TRUE)
## [1] Sat
## Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
dia
## [1] "1989-07-29 03:01:42 UTC"

Você também pode usar essas funções para atribuir esses componentes a uma data:

data <- dmy(01041991)
data
## [1] "1991-04-01"
hour(data) <- 20
data
## [1] "1991-04-01 20:00:00 UTC"
day(data) <- 10
data
## [1] "1991-04-10 20:00:00 UTC"
today() 
## [1] "2019-11-26"
now()
## [1] "2019-11-26 22:01:50 -02"

Aritmética com datas

Veja alguns exemplos de operações aritméticas que você pode fazer utilizando funções do lubridate:

data <- dmy(31012000)

data + ddays(1)
## [1] "2000-02-01"
data + dyears(1)
## [1] "2001-01-30"
data + months(1)  # Operações que resultam em datas inválidas geram NAs.
## [1] NA
## [1] NA

# Criando datas recorrentes

reuniao <- dmy("18-03-2017")
reunioes <- reuniao + weeks(0:10)
reunioes
##  [1] "2017-03-18" "2017-03-25" "2017-04-01" "2017-04-08" "2017-04-15"
##  [6] "2017-04-22" "2017-04-29" "2017-05-06" "2017-05-13" "2017-05-20"
## [11] "2017-05-27"
# Duração de um intervalo 
intervalo <-dmy("01-03-2003") %--% dmy("31-03-2003") 

intervalo / ddays(1)               # Número de dias
## [1] 30
## [1] 30
intervalo / dminutes(1)            # Número de minutos
## [1] 43200
## [1] 43200

as.period(intervalo)
## [1] "30d 0H 0M 0S"
## [1] "30d 0H 0M 0S"