Treballar amb dates

Author

Mireia Camacho

La llibreria Lubridate

Lubridate és una llibreria que forma part de l’entorn Tidyverse i està especialitzada en el tractament i neteja de DATES.

Segueix la mateixa lògica que el Tidyverse i és molt fàcil enllaçar les seves funcions amb les apreses fins ara, però no forma part del core de Tidyverse.

Això implica que si volem utilitzar-la l’haurem de carregar a part amb library(lubridate) o, en cas de no tenir-la instal·lada: install.packages(lubridate).

library(tidyverse)
library(lubridate)

El format

Moltes funcions d’R només permeten com a argument elements de la classe <date>. Per tant, si tenim un dataset que té una columna amb dates però no està amb la classe <date>, no podrem treballar-les usant aquestes funcions.

Fins ara el que hem vist és que per a transformar un vector o una columna a la classe <date> només cal aplicar-li la funció as.Date().

data <- "2024-12-03"
class(data)
[1] "character"
data_corregida <- as.Date(data)
class(data_corregida)
[1] "Date"

Els diferents formats de les dates

Les dates es poden presentar en formats molt diferents, però la funció as.Date() només funciona quan el format és YYYY-MM-DD (any-mes-dia).

data_format1 <- "2024-12-03"

as.Date(data)
[1] "2024-12-03"
data_format2 <- "03-12-2024"

as.Date(data_format2)
[1] "0003-12-20"

Transformar en data qualsevol format

  • ymd(): Transforma en classe <date> les dates amb el format Year-Month-Day.
data_ymd <- "2024-12-03"

ymd(data_ymd)
[1] "2024-12-03"
class(ymd(data_ymd))
[1] "Date"
  • dmy(): Transforma en classe <date> les dates amb el format Day-Month-Year.
data_dmy <- "03-12-2024"

dmy(data_dmy)
[1] "2024-12-03"
  • mdy(): Transforma en classe <date> les dates amb el format Month-Day-Year.
data_mdy <- "12-03-2024"

dmy(data_mdy)
[1] "2024-03-12"

Dates i hores

Un altre format recurrent en els datasets és el de data i hora en una mateixa cel·la. Per exemple: "2024-12-03 15:30:00".

Si volem quedar-nos només amb la data, podem transformar la string amb la funció as.Date():

as.Date("2024-12-03 15:30:00")
[1] "2024-12-03"

Però si volem treballar tant amb la data com amb l’hora, podem transformar la string a la classe <POSIXct> / <datetime>.

Les funcions ymd_hms(), dmy_hms() i altres derivades com ymd_h(), mdy_hm() treballen amb aquest tipus de strings i les transformen a la classe <POSIXct>.

class(ymd_hms("2024-12-03 15:30:00"))
[1] "POSIXct" "POSIXt" 
ymd_hms("2024-12-03 15:30:00")
[1] "2024-12-03 15:30:00 UTC"
ymd_hms("2024-12-03 15:30:00", tz="CET")
[1] "2024-12-03 15:30:00 CET"

Extreure elements de les dates

La llibreria Lubridate també ofereix funcions que ens permeten treballar amb els components de les dates.

Per exemple, si volem crear una nova columna amb només els anys, podem utilitzar la funció year():

year("2024-12-03 15:30:00")
[1] 2024

El mateix es pot aplicar a les funcions month(), day(), hour(), minute(), second() i fins i tot el dia de la setmana (wday()) o el dia de l’any (yday()).

wday("2024-12-03 15:30:00", label = TRUE)
[1] Tue
Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat

Càlculs amb dates

El format <date> ens permet sumar i restar dates sense grans complicacions.

ymd("2024-12-03") + days(10)
[1] "2024-12-13"
ymd("2024-12-03") - weeks(2)
[1] "2024-11-19"
ymd("2024-12-03") + hours(3) + minutes(5)
[1] "2024-12-03 03:05:00 UTC"

⚠️AVÍS: No confondre les funcions years(),months(), days(),weeks(),etc. amb les funcions en singular year(), month(), day()

Arrodonir dates

Les dates també es poden arrodonir a conveniència amb les funcions floor_date(), ceiling_date() i round_date().

floor_date(ymd_hms("2024-12-03 15:30:25"), "hours")
[1] "2024-12-03 15:00:00 UTC"
ceiling_date(ymd_hms("2024-12-03 15:30:25"), "day")
[1] "2024-12-04 UTC"

Intervals de dates

Podem fixar intervals entre dues dates amb la funció interval() i respondre preguntes com:

  • Quants dies / hores han passat?
  • La data X es troba dins l’interval que té el dataset?
interval <- interval(ymd("2023-12-03"), ymd("2024-12-03"))

time_length(interval, "days")
[1] 366
time_length(interval, "hours")
[1] 8784
time_length(interval, "months")
[1] 12
ymd("2024-05-03") %within% interval
[1] TRUE