3.3 : Les dates en R

Dans ce chapitre, nous allons découvrir rapidement deux classes pré-existante en R pour permettre la manipulation des dates. La première est la classe Date , qui permet de représenter des dates au format jour/mois/année. La seconde classe est la classe POSIXct qui elle permet en plus de tenir compte de l'heure et du nombre de secondes, ce que la classe Date ne permet pas de faire. Nous allons aussi voir que ces deux classes ont en réalité un fonctionnement interne très proche de la classe date fictive que nous avions imaginée au chapitre précédent.

La classe Date

La classe Date nous permet de représenter en R un objet qui contient une date. Pour creer une date, il suffit d'utiliser la fonction as.Date() et de lui passer une chaine de caractère au format "aaaa-jj-mm" . Voici un exemple :

anniversaire = as.Date("1992-07-31")
print(anniversaire)

R nous affiche bien la date entrée, sous forme de chaine de caractère. La fonction as.Date() est intelligente : elle connait les années bisextilles et le nombre de jours par mois, aussi elle vous affichera une erreure si vous essayez de créer une date qui n'existe pas, comme le 30 février :

anniversaire = as.Date("1992-02-30")

Remarque : on voit que le message d'erreur fait référence à une fonction charToDate(). C'est en réalité une méthode de la classe date, qui convertir comme son nom l'indique une chaine de caractère en date ! En effet, dans la classe Date , les dates sont en réalité des nombres.

Choisir le format de la date

Le format par défaut de la chaine de caractère pour écrire une date est le suivant : "aaaa-mm-jj" , qui est un format anglo-saxon. Il est heureusement possible de changer le format de la chaine utilisée à l'aide du paramètre format de la fonction as.Date() . Ecrivons au date au format "mois-jj-aaaa" :

date = date = as.Date("12 janv. 1992" , format = "%d %b %Y")
print(date)

Le paramètre format accepte une chaine de caractères, où le jour, l'année et le mois sont représentés par un symble % suivit d'une lettre, et où les sépérateurs sont indiqués. Dans la chaine "%d %b %Y" , %d indique que la date commence par le jour au format numérique, qu'il y a un espace, puis le mois écrit en abrégé (janv. pour janvier en français), et enfin après un second espace, %Y indique que l'on attend l'année en format aaaa .

Voici un tableau qui indique toutes les différents formats possibles :

Format Utilisation Exemple
%Y année au format long (4 chiffres) 2016, 2017
%y année en format abrégé (2 chiffres) 98, 02
%b mois en format abrégé janv. , oct.
%B mois au format long janvier, octobre
%m mois au format numérique 01, 10
%d jour du mois au format numérique 07, 16, 28

On peut voir que par exemple pour écrire une date au format français "jj-mm-aaaa", il faut spécifier la chaine suivante en format : "%d-%m-%Y" . On peut aussi choisir les séparateurs, si on veut remplacer les - par des espaces, il faut écrire : "%d %m %Y" . Vous pouvez ainsi facilement travailler avec les dates au format qui sera imposé par votre base de données, et les convertir en date R classiques.

Remarque : Les mois en format abrégé (%b) et format long (%B ) dépendent de la langue de votre machine ! Ainsi si vous entrez une date avec un format anglais (par exemple Jan au lieu de janv. ) et que votre ordinateur est en Français, R vous affichera une erreur ou votre date sera transformée en NA . C'est pourquoi il est déconseillé de travailler avec ces formats "en lettres", car ils dépendent de la langue de votre machine. Travaillez toujours si possible avec des formats numériques.

Le type et la classe

On peut vérifier que nos objets sont bien de la classe date, avec la fonction class() :

class(anniversaire)
#affiche "Date"

Cette classe se retrouve également dans l'onglet Environment , sous la notion trompeuse de Type :

Les objets de classe Date fonctionnent comme nous l'avons décrit dans le chapitre précédent pour imaginer une classe date fictive : la date est en réalité un nombre qui représente le nombre de jours écoulés depuis une date de départ (le 1er janvier 1970). La classe contient alors diverses fonctions (comme asDate() que nous connaissons) pour rendre cela transparent et nous permettre de les manipuler facilement.

Pour s'en rendre compte, il suffit d'afficher le type d'un objet date, avec typeof() :

typeof(anniversaire)

On remarque alors que notre variable est bien de type double. Bien entendu, la plupart du temps, la classe est le plus important à connaitre, car elle indique ce que représente l'objet et comment il va se comporter. Connaitre son type nous sert juste à mieux comprendre ce qui se passe en interne.

Manipuler des dates

Nous allons maintenant voir quelques moyens de travailler avec les objets de la classe Date en R.

Obtenir la date du jour

Il est parfois utile de pouvoir obtenir la date du jour, par exemple pour construire une application qui récupérerait des données passées jusqu'a la date actuelle. R nous fourni une fonction qui fait ce travail à notre place, la fonction Sys.Date() :

today = Sys.Date() #on récupére la date du jour

Ajouter ou soustraire un nombre de jours à une date

On peut facilement ajouter un nombre de jours à une date et R nous indiquera la date correspondante. Si je veux savoir quel jour sera 14 jours après mon anniversaire je peux simplement utiliser l'opération + comme ceci :

demain = today + 1
print(demain)

Si on peut ajouter des jours avec l'opérateur + , il est également possible d'en retrancher avec l'opérateur - . Le fonctionnement est alors identique.

hier = today - 1
avant_hier = today -2

En réfléchissant un peu, on comprends facilement comment R réalise ces opérations en interne. Comme les dates sont stockées sous formes de doubles , il suffit d'ajouter le double qui représente la date avec le nombre de jours à ajouter, puis de reconvertir le tout en chaine de caractéres !

Multiplier des dates n'aurait aucun sens. Que voudrais dire multiplier le 31 juillet par le 12 janvier ? Ainsi, bien les dates soient de type double, la classe date interdit leur multiplication, en indiquant que la multiplication n'est pas définie pour les objets dates :

Extraire le jour de la semaine d'une date

Il existe des méthodes utilitaires de la classe Date pour récupérer les différents composants d'une date. Pour récupérer le jour de la semaine d'une date donnée, on peut utiliser la fonction weekdays() :

dayToday = weekdays(today) #nous sommes Samedi aujourd'hui !

Comme vous voulez le voir, ces fonctions retournent une chaine de cractére, avec le nom du jour dans la langue de la machine sur laquelle R est installé.

Extraire le mois d'une date

Une fonction identique existe aussi pour récupérer le mois d'une date donnée : la fonction months() qui porte bien son nom. Cette fonction retourne par défaut le mois au format de chaine de carctère :

moisToday = months(today) #Septembre

On peut obtenir le mois au format abrégé en passant le second paramètre (abbreviate ) à TRUE :

moisToday = months(today, abbreviate = TRUE) #sep.

Il n'existe pas de fonction basique en R pour obtenir le mois d'une date au format numérique. De même, il n'existe bizarrement pas de fonction pour extraire l'année directement d'une date en R. Heureusement, nous verrons plus tard qu'il existe des packages qui permettent de combler tous ces manques et de travailler facilement avec les dates.

Extraire le trimestre d'une date

Il existe enfin une fonction quarters() qui indique à quelle trimestre une date appartient. Le premier janvier appartiendra ainsi au premier trismestre, noté Q1.

trimestre = quarters(today) #affiche "Q3"

Cette fonction peut être très utile pour certains usages, par exemple en finance où l'on raisonne souvent par trismestres.

La classe POSIXct

Cette seconde classe permet de représenter les dates également, mais en tennant compte cette fois de l'heure précise (heures et minutes) du jour en question. Pour créer une date ainsi, il faut utiliser la fonction asPOSIXct() . Cette fonction comporte trois arguments principaux :

  • Le premier argument qui contient la chaine de la date
  • Un second argument format qui contient le format de cette chaine
  • Un argument tz qui indique le fuseau horraire de la date.
date = "15 janvier 2017 12h57:10"
date_format = "%d %B %Y %Hh%M:%S"
date_complete = as.POSIXct(date,format = date_format, tz = "GMT")

Le format

Le format s'exprime de façon identique à ce que nous avons vu pour la fonction asDate() , simplement il comporte des éléments suplémentaires pour indiquer le format de l'heure, des minutes et des secondes, qui sont indiqués dans ce tableau :

Format Utilisation Exemple
%H Indique l'heure au format 24h 16
%h Indique l'heure au format 12h 4
%M Indique les minutes 36
%S Indique les secondes 14

Manipuler la classe POSIXct

La classe POSIXct fonctionne en interne de la même façon que la classe Date, simplement elle compte le nombre de secondes depuis le 01 janvier 1970 et non le nombre de jours. On peut ainsi facilement y ajouter ou retrancher des nombres entiers, ce qui revient à y ajouter ou retirer des secondes.

De même, toutes les fonctions que nous avons vu plus haut pour extraire le jour ou le mois d'un objet Date fonctionnent également avec les objets POSIXct. Nous n'allons donc pas vous les redonner en exemples ici.

Aller plus loin avec les dates en R

Nous avons vu dans ce chapitre uniquement les principales classes que R posséde pour gérer les dates, et quelques opérations simples que l'on peut réaliser avec. Le langage R manque malheureusement de base de nombreuses fonctionnalités indispensable pour ceux qui veulent travailler avec les dates. Il existe pour cela de nombreux packages (qui sont des sortes d'extensions du langage et apportent de nouvelles fonctions et classes) qui permettent de résoudre ces problèmes. Nous reparlerons de ces packages dans la section suivante de ce cours, et nous y présenterons un package très utile pour la gestion des dates.

Conclusion :

  • R dispose de deux classes pour gérer les dates : Date et POSIXct . La première gere les dates à la précision d'un jour de l'année, et la seconde permet une précision jusqu'à l'heure et la seconde prêt.
  • Ces deux classes fonctionnent de la même façon : elles sont de type double , et stockent en interne le nombre de jours ou de secondes depuis le 01 janvier 1970.
  • On peut créer une date avec asDate() ou asPOSIXct() et une chaine de caractères. L'argument format permet de préciser le format de la date en entrée.
  • Les opérateurs + et - permettent d'ajouter/retirer des jours/secondes aux objets dates.
  • Il existe quelques fonctions de base pour extraire un jour d'une date ou encore le mois.
  • Pour aller plus loin avec les dates en R, il faut utiliser des packages, que nous découvrirons a la section suivante.

results matching ""

    No results matching ""