Travailler avec des dates dans R

Classes pour dates et temps

Il existe 3 classes de date/temps dans R: Date, POSIXct et POSIXlt.

Date

Date est la classe la plus simple, utilisée quand on n’a qu’une date et pas de temps. Pour rappel, les langages de programmation utilisent une date “origine” pour indexer les dates. L’origine est le 1970-01-01, qui est le jour zéro (et non 1). Attention qu’Excel place la date origine au 1900-01-01 (qui est le jour 1 et non 0) (sous Windows; sous Mac Excel débute le 1904-01-01…). De plus Excel compte un jour en trop: le 29 février 1900 qui n’existe pas.

# create a date
dt1 <- as.Date("2015-05-06")
dt1
[1] "2015-05-06"
# format
dt2 <- as.Date("10/05/2015", format = "%m/%d/%Y")
dt2
[1] "2015-10-05"
# Excel data
as.Date(42128, origin = "1900-01-01")
[1] "2015-05-06"
# difference between dates
dt2 - dt1
Time difference of 152 days
difftime(dt2, dt1, units = "weeks")
Time difference of 21.71429 weeks
dt1 + 10
[1] "2015-05-16"
vector.dt <- as.Date(c("2015-05-06", "2015-05-16", "2015-05-26"))
vector.dt
[1] "2015-05-06" "2015-05-16" "2015-05-26"
diff(vector.dt)
Time differences in days
[1] 10 10
seq(dt1, length = 4, by = "week")
[1] "2015-05-06" "2015-05-13" "2015-05-20" "2015-05-27"
# internal integer representation
unclass(dt1)
[1] 16561

POSIXt

Il y a deux types POSIXt: POSIXct et POSIXlt. ct veut dire “calendar time” (enregistrant les secondes depuis l’origine) et lt “local time” (enregistrant la date selon une liste d’attributs).

dtx1 <- as.POSIXct("2015-05-06 14:30:45")
dtx1
[1] "2015-05-06 14:30:45 EDT"
dtx2 <- as.POSIXct("06052015 14:30:45", format = "%d%m%Y %H:%M:%S")
dtx2
[1] "2015-05-06 14:30:45 EDT"
# time zone:
dtx3 <- as.POSIXct("2015-05-06 14:30:45", tz = "GMT")
dtx3
[1] "2015-05-06 14:30:45 GMT"
dtx4 <- as.POSIXlt("2015-05-06 14:30:45")
dtx4
[1] "2015-05-06 14:30:45 EDT"
unclass(dtx4)
$sec
[1] 45

$min
[1] 30

$hour
[1] 14

$mday
[1] 6

$mon
[1] 4

$year
[1] 115

$wday
[1] 3

$yday
[1] 125

$isdst
[1] 1

$zone
[1] "EDT"

$gmtoff
[1] NA

Truc: Noter le format de date utilisé jusqu’à présent. Pour plus d’infos, cf. ?strftime.

Truc: Il faut utiliser Date ou POSIXct dans un data frame.

Manipulation de dates avec lubridate

“Makes working with dates fun instead of frustrating”.

library(lubridate)
Loading required package: methods
dtl1 <- ymd_hms("2015-05-06 14:30:45")
dtl1
[1] "2015-05-06 14:30:45 UTC"
dtl2 <- dtl1 + days(5)
dtl2
[1] "2015-05-11 14:30:45 UTC"
month(dtl1)
[1] 5

Lubridate considère 4 types d’objets: instants, intervals, durations et periods.

Instant

Un instant est un moment spécifique dans le temps.

now()
[1] "2015-05-05 16:06:05 EDT"
# last day of the month
ceiling_date(now(), unit = "month") - days(1)
[1] "2015-05-31 EDT"
# morning?
am(now())
[1] FALSE
# instant in different time zone
with_tz(now(), "Europe/Paris")
[1] "2015-05-05 22:06:05 CEST"

Intervals, durations, periods

Un interval est le temps entre deux instants. Une duration est le temps écoulé exactement, mesuré en secondes. C’est le temps absolu entre deux évènements. Une period est le temps relatif entre deux évènements.

# interval
int1 <- as.interval(dtl1, dtl2)
int1
[1] 2015-05-06 14:30:45 UTC--2015-05-11 14:30:45 UTC
int1/ddays(1)
[1] 5
ymd("2015-06-01") %within% int1
[1] FALSE
# duration
five.m <- dminutes(5)
five.m
[1] "300s (~5 minutes)"
# period
two.w <- weeks(2)
two.w
[1] "14d 0H 0M 0S"

Autre package: chron.


Information additionnelle

lubridate