0.1 Introdução

Criado por Garrett Grolemund e Hadley Wickham, o pacote Lubridate foi criado com a intenção de facilitar a manipulação de datas e horas em uma determinada base de dados, como iremos ver a seguir o pacote é de grande utilidade para diversos problemas que encontramos no dia-a-dia, como: fusos, ordenação, contagem, dentre outros.

1 Instalando e abrindo o Pacote

install.packages(“lubridate”)

library(lubridate)

1.1 Início

Começaremos aprendendo algumas manipulações que são extremamente simples se usarmos o pacote, e que utilizam um codigo e funções muito mais trabalhosas no R base.

Criando uma data aleatória

date <- dmy("01-02-2019")

Com o comando “month”, o mês da data é retornado para o usuário

month(date)
## [1] 2
month(date, label = TRUE, abbr = FALSE)## Retorna o mês por extenso
## [1] fevereiro
## 12 Levels: janeiro < fevereiro < março < abril < maio < ... < dezembro

Da mesma forma para o ano e o dia, utilizando “year” e “day”

day(date)
## [1] 1
year(date)
## [1] 2019

“wday” nos retorna o dia da semana referente a data:

wday(date, label = TRUE, abbr = FALSE)
## [1] sexta
## 7 Levels: domingo < segunda < terça < quarta < quinta < ... < sábado

1.2 Alterando o dia, o mês ou o ano

Podemos facilmente mudar expecificamente o dia, o mês ou o ano de uma data com comandos curtos e rápidos, como por exemplo: Mudando o dia 1 de fevereiro para o dia 5:

date <- date + days (4) ## Recebendo 4 dias
date
## [1] "2019-02-05"

Igualmente para alterarmos o mês ou o ano:

date <- date + months(4)## de fevereiro para junho
date<- date - years(1) ## 2019 para 2018
date
## [1] "2018-06-05"

1.3 Ordenando de diferentes formas:

A forma como o r te retornará o data selecionada, pode ser alterada de acordo com a vontade de cada um, abaixo uma tabela simples contém o comando para cada tipo de ordenação de data e hora(que veremos mais adiante) do pacote.

Ordem Símbolo
Ano/Mês/Dia ymd()
Mês/Dia/Ano mdy()
Ano/Dia/Mês ydm()
Dia/Mês/Ano dmy()
Hora,Minuto hm()
Hora,Minuto,Segundo hms()
Ano/Mẽs/Dia, Hora,Minuto,Segundo ymd_hms()

1.4 Trabalhando com horas

Utilizaremos a funçãp hms para adicionar um horario

date <- ymd_hms("2018-02-01 10:00:00")
date
## [1] "2018-02-01 10:00:00 UTC"

Podemos mudar apenas o horário da data, mantendo os minutos e os segundo:

hour(date) <-12 ## Agora a hora é meio-dia
date
## [1] "2018-02-01 12:00:00 UTC"

De forma semelhante para os minutos e os segundos:

minute(date) <- 12
second(date) <- 12
date
## [1] "2018-02-01 12:12:12 UTC"

É sempre bom ficar atento as funções no singular e no plural, ao se adicionar ou subtrair horas minutos, dias , segundos entre outros, utilizamos a função no plural , já para substituição do horario ou dia usasse a função no singular.

2 Intervalos

Com o pacote Lubridate, conseguimos facilmente calcular um intervalo precisamente, para isso a principal funão usada é a que mescla horários e datas, ou seja, a função ymd_hms().

day1 <- ymd_hms("2019-02-10 10:30:15")
day2 <- ymd_hms("2019-02-7 12:12:12")
day3 <- day1 - day2
day3
## Time difference of 2.929201 days

A função now(), irá te retornar o exato momento em que o comando foi efetuado n próprio fuso horário

now()
## [1] "2019-03-26 14:39:00 -03"

2.1 Duração

A duração de um determinado evento pode ser retornada de forma simple com a utilização da função “new_duration”, como veremos a seguir:

duration(60)
## [1] "60s (~1 minutes)"

Pórem seria inviavél representar longas durações por meio de segundos, desse modo outras função podem ser utilizas, como por exemplo : ddays, dminutes, dweeks, dyears. Veremos a seguir na prática como isso funciona:

dminutes(4) ## Quantos segundos há em 4 minutos?
## [1] "240s (~4 minutes)"
dhours(8) ## Quantos segundos há em 8 horas?
## [1] "28800s (~8 hours)"
ddays(1) ## Quantos segundos há em um dia?
## [1] "86400s (~1 days)"
dyears(1) ## Quantos segundos há em um ano?
## [1] "31536000s (~52.14 weeks)"

Podemos adicionar qualquer duração ao objeto já criado anteriormente no R, como por exemplo adicionar 5 minutos no objeto “date”

date + dminutes(5)
## [1] "2018-02-01 12:17:12 UTC"

Também podemos identificar a duraçao de um objeto já criado utilizando a função as.duration

date2 <- interval(ymd("2018-01-01"), ymd("2019-01-01"))
as.duration(date2)
## [1] "31536000s (~52.14 weeks)"

2.2 Períodos

Com o pacote Lubridate, podemos criar periodos de forma semelhante as durações, assim sendo, utilizamos o help das funções days(), weeks(), hours(), minutes(), years(),and seconds()

weeks(2) + days(2)
## [1] "16d 0H 0M 0S"
years(2) + days(2)
## [1] "2y 0m 2d 0H 0M 0S"

Ao se comparar as funções duração e período, percebemos que há uma semelhança muito grande em ambas, porém como os nomes mesmo já dizem, enquanto a duração trabalha com uma duração expecifica, o perido trabalha com períodos fechados, como por exemplo, em um ano bissexto, ao se adicionar dyears(1) somaremos 365 dias em uma analise, e não um ano como queremos, fato que não ocorre na função years(1), veremos a seguir.

bis <- ymd_hms("2012-01-01 13:00:00")
bis + dyears(1)
## [1] "2012-12-31 13:00:00 UTC"
bis + years(1)
## [1] "2013-01-01 13:00:00 UTC"

3 Fuso Horário

Trabalhar com fusos horários não é muito comum e nem muito interessante quando temos uma base de dados, porém podemos sim trabalhar com eles com o pacote lubridate, a nomeclatura mais utilizada é a (UTC) Universal time zone, a seguir utilizaremos a função with_tz para comerçarmos a trabalhar com fusos.

hoje <- now()
hoje
## [1] "2019-03-26 14:39:01 -03"
with_tz(hoje, "Europe/Istanbul") ## Passando o fuso de São Paulo para o de Istanbul
## [1] "2019-03-26 20:39:01 +03"

Com a função now(), podemos acessar a hora exata no seu e em difentes fusos horários, além de representar em qual fuso estamos atualmente em uma escala numérica.

Agora, ao contrário da função with_tz(), a função force_tz, altera o fuso horário do seu objeto, porém mantém o horário o mesmo.

hoje
## [1] "2019-03-26 14:39:01 -03"
force_tz(hoje, "Europe/Istanbul" )
## [1] "2019-03-26 14:39:01 +03"

Para saber todas as zonas que temos disponíveis no R, acessar o help da função Sys.timezone(), normalmente apenas com o comando OlsonNames(), já é possivél obter todas as zonas, pórem não é uma regra e pode variar de computador para computador.

4 Fontes

Nesse post não entrarei a fundo a respeito utilização do pacote aplicado a gŕaficos e situações do cotidiano, foi apenas uma introdução a aplicação do pacote, viso que ele abrache muito mais do que eu poderia explicar em um único post.

CRAN : https://cran.r-project.org/web/packages/lubridate/vignettes/lubridate.html

BLOG : https://www.r-statistics.com/2012/03/do-more-with-dates-and-times-in-r-with-lubridate-1-1-0/

ARTIGO : https://www.jstatsoft.org/article/view/v040i03

GITHUB : https://github.com/hadley/lubridate