26 Dates dans R
26.1 Introduction
Travailler avec des dates peut être très frustrant. En général, le mieux est de travailler avec la classe de données la plus facile. Cela signifie par exemple que si la variable avec laquelle on travaille est en années, le mieux est d’en faire un integer; il n’y a pas de raison d’en faire une variable de la classe date ou date-time. Si par contre, ce n’est pas possible d’utiliser une de ces classes simplifiées, on peut utiliser la classe Date
dans R.
26.2 Convertir en la classe Date
On peut convertir une variable de classe character en une variable de classe Date
en utilisant as.Date()
:
Notez que les deux apparaissent de la même manière, même si leur classe est différente.
## [1] "2018-10-12"
## [1] "2018-10-12"
## [1] "character"
## [1] "Date"
Si la date n’a pas le format YYYY-MM-DD ou YYYY/MM/DD, il faudra spécifier le format dans lequel on souhaite convertir la nouvelle variable de classe Date
en utilisant le symbole %
de la façon suivante:
## [1] "2005-01-06"
Pour une liste de toutes les spécifications possibles dans R, voir ?strptime
.
Tidyverse lubridate rend la conversion de dates qui ne sont pas dans un format standard très facile grâce aux fonctions ymd()
, ydm()
, mdy()
, myd()
, dmy()
, dym()
et autres.
## [1] "1907-04-13"
Essayez as.Date("April 13, 1907")
et vous verrez les avantages d’utiliser une fonction lubridate.
26.3 Travaillez avec la classe Date
Cela vaut clairement la peine de convertir des variables en la classe Date
car on peut faire beaucoup de choses avec ce genre de variable qu’on ne pourrait pas faire si on les avait laissés en character.
Nombre de jours entre deux dates:
## Time difference of 305 days
Comparer deux dates:
## [1] TRUE
Notez que Sys.Date()
renvoie la date d’aujourd’hui en une variable de classe Date
:
## [1] "2019-10-31"
## [1] "Date"
R a des fonctions pour extraire des informations particulières à partir d’une date:
## [1] "Thursday"
## [1] "Thu"
## [1] "October"
## [1] "Oct"
## [1] "Q4"
Le package lubridate procure des fonctions additionnelles pour extraire plus d’information à partir d’une date de classe Date
:
## [1] 2019
## [1] 304
## [1] 10
## [1] Oct
## 12 Levels: Jan < Feb < Mar < Apr < May < Jun < Jul < Aug < Sep < ... < Dec
## [1] 31
## [1] 44
## [1] 5
26.4 Tracez des graphes avec une variable de classe Date
On peut travailler avec base R graphics et ggplot2, les deux peuvent travailler avec une variable de la classe Date
et nommer les axes correctement:
26.4.1 base R
df <- read.csv("data/mortgage.csv")
df$DATE <- as.Date(df$DATE)
plot(df$DATE, df$X5.1.ARM, type = "l") # on the order of years
Notez le changement des labels de l’axe x dans le deuxième graphe.
26.4.2 ggplot2
Notez que contrairement à read.csv()
de base R, readr::read_csv()
lit automatiquement DATE comme une variable de classe Date
par ce que cette variable est déjà sous la forme YYYY-MM-DD:
## Parsed with column specification:
## cols(
## DATE = col_date(format = ""),
## `5/1 ARM` = col_double(),
## `15 YR FIXED` = col_double(),
## `30 YR FIXED` = col_double()
## )
ggplot(df %>% filter(DATE < as.Date("2006-01-01")),
aes(DATE, `30 YR FIXED`)) +
geom_line() +
theme_grey(14)
A nouveau, lorsque les données sont filtrées, les labels de l’axe x changent de years à months.
26.4.2.1 Breaks, limits, labels
On peut contrôler les breaks, limits et labels de l’axe x grâce à scale_x_date()
:
library(lubridate)
g + scale_x_date(limits = c(ymd("2008-01-01"), ymd("2008-12-31"))) +
ggtitle("limits = c(ymd(\"2008-01-01\"), ymd(\"2008-12-31\"))")
(Oui, même dans le package tidyverse on ne peut pas complètement échapper à l’utilisation de %
pour convertir les formats des dates. Pour rappel, ?strptime
si besoin d’aide).
26.4.2.2 Annotations
On peut utiliser geom_vline()
et `annotate() pour marquer des événements spécifiques dans une série temporelle:
ggplot(df, aes(DATE, `30 YR FIXED`)) +
geom_line() +
geom_vline(xintercept = ymd("2008-09-29"), color = "blue") +
annotate("text", x = ymd("2008-09-29"), y = 3.75,
label = " Market crash\n 9/29/08", color = "blue",
hjust = 0) +
scale_x_date(limits = c(ymd("2008-01-01"), ymd("2009-12-31")),
date_breaks = "1 year",
date_labels = "%Y") +
theme_grey(16) +
ggtitle("`geom_vline()` with `annotate()`")
with