Análise de Dados em R (FNDE) - Módulo 2
Allan Vieira
julho de 2018
trabalhar com datas (e tempos) no base R geralmente era um processo frustrante
as funções “nativas” do R para dados do tipo date-times são pouco intuitivas e mudam dependendo do tipo de objeto que está sendo usado;
Datas e tempos têm uma série de especificidades, como por exemplo fusos, anos bissextos, horários de verão, etc;
Por isso precisamos ter métodos robustos para lidar com esses tipos de peculiaridades;
O pacote lubridate nos facilita algumas operações que já existiam no base R e abre a possibilidade de outras que não haviam.
** DD/MM/YYYY estar em número ou string não é a mesma coisa que estar no formato de data !!**
o R possui uma classe específica para indicar datas
Dito isso, …
Algumas funções interessantes são: ymd(), ymd_hms, dmy(), dmy_hms, mdy(), etc. ??lubridate
.
library(lubridate)
ymd(20101215)
[1] "2010-12-15"
mdy("4/1/17")
[1] "2017-04-01"
A informação mais completa de data-hora que você pode ter no R é:
arrive <- ymd_hms("2011-06-04 12:00:00", tz = "Pacific/Auckland")
arrive
[1] "2011-06-04 12:00:00 NZST"
#> [1] "2011-06-04 12:00:00 NZST"
leave <- ymd_hms("2011-08-10 14:00:00", tz = "Pacific/Auckland")
leave
[1] "2011-08-10 14:00:00 NZST"
# help(ymd_hms)
# para verificar as timezone disponíveis:
#str_subset(OlsonNames(), "Brazil")
# ou grep("Brazil", OlsonNames(), )
year(), month(), mday(), hour(), minute() and second():
bday <- dmy("02/01/1984")
month(bday)
[1] 1
month(bday, label=TRUE)
[1] Jan
12 Levels: Jan < Feb < Mar < Apr < May < Jun < Jul < Aug < Sep < ... < Dec
wday(bday)
[1] 2
wday(bday, label = TRUE)
[1] Mon
Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
year(bday) <- 2016
wday(bday, label = TRUE)
[1] Sat
Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
now()
[1] "2018-12-09 03:29:15 -02"
today()
[1] "2018-12-09"
second(arrive)
[1] 0
second(arrive) <- 25
arrive
[1] "2011-06-04 12:00:25 NZST"
second(arrive) <- 0
time <- ymd_hms("2010-12-13 15:30:30")
time
[1] "2010-12-13 15:30:30 UTC"
# Diz a hora que seria "time" em outro fuso
with_tz(time, "America/Chicago")
[1] "2010-12-13 09:30:30 CST"
# Mantém o print da hora, mas muda região
force_tz(time, "America/Chicago")
[1] "2010-12-13 15:30:30 CST"
# Primeiro, criamos um intervalo:
auckland <- interval(arrive, leave)
auckland
[1] 2011-06-04 12:00:00 NZST--2011-08-10 14:00:00 NZST
#> [1] 2011-06-04 12:00:00 NZST--2011-08-10 14:00:00 NZST
auckland <- arrive %--% leave
auckland
[1] 2011-06-04 12:00:00 NZST--2011-08-10 14:00:00 NZST
E podemos verificar por exemplo se esse intervalo faz overlap (sobrepõe) com algum outro intervalo que já temos.
jsm <- interval(ymd(20110720, tz = "Pacific/Auckland"), ymd(20110831, tz = "Pacific/Auckland"))
jsm
[1] 2011-07-20 NZST--2011-08-31 NZST
# há sobreposição?
int_overlaps(jsm, auckland)
[1] TRUE
# quando ocorre sobreposição?
setdiff(auckland, jsm)
[1] 2011-06-04 12:00:00 NZST--2011-07-20 NZST
Outras funções que lidam com intervalos são: int_start, int_end, int_flip, int_shift, int_aligns, union, intersect, setdiff e %within%.
minutes(2) ## period
[1] "2M 0S"
dminutes(2) ## duration
[1] "120s (~2 minutes)"
Por que 2 classes?
Durations vão sempre gerar resultados precisos em termos de tempo, considerando, por exemplo, se o ano é bissexto ou não;
Periods, por sua vez, vão se basear na number line, desconsiderando detalhes como anos bissextos etc.
Ambas as classes serão úteis para fazermos operações aritméticas com datas, dependendo do nosso objetivo.
leap_year(2011) ## regular year
[1] FALSE
leap_year(2012) ## leap year
[1] TRUE
ymd(20120101) + dyears(1)
[1] "2012-12-31"
# dyears(1) sempre somará considerando se o ano é bissexto ou não
ymd(20120101) + years(1)
[1] "2013-01-01"
Para saber quanto tempo em dias, semanas ou minutos você passou no seu compromisso em Auckland:
auckland / ddays(1)
[1] 67.08333
auckland / dweeks(1)
[1] 9.583333
auckland / dminutes(1)
[1] 96600
Para não termos que ficar trabalhando com frações de meses ou semanas por exemplo, podemos utilizar módulo:
auckland %/% months(1)
[1] 2
auckland %% months(1)
[1] 2011-08-04 12:00:00 NZST--2011-08-10 14:00:00 NZST
Outros exemplos:
x <- dmy(02011984)
year(x) + 34
[1] 2018
day(x) -1
[1] 1
month(x)*2
[1] 2
Mais detalhes sobre lubridate em http://lubridate.tidyverse.org.
OBRIGADO!!