Il existe 3 classes de date/temps dans R: Date
, POSIXct
et POSIXlt
.
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
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
ouPOSIXct
dans undata frame
.
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
.
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"
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