Menu

Les dates en R : as.Date, format() et arithmétique des dates

La classe Date de R est un compteur de jours déguisé. Comment analyser des chaînes avec as.Date, formater des dates en sortie, les soustraire, construire des séquences, et quand il te faut POSIXct à la place.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Une date en R est un compteur de jours déguisé

Pour transformer une chaîne en vraie date, utilise as.Date() ; pour obtenir aujourd'hui, utilise Sys.Date(). Derrière les deux se cache une astuce simple : la classe Date de R n'est qu'un nombre - le compte des jours depuis le 1er janvier 1970 - affublé d'un costume qui le fait s'afficher comme une date de calendrier. Tu peux lui retirer le costume avec unclass() :

Ce 20672 est le compte de jours brut, et c'est ce qui fait fonctionner tout le reste de cette page : comparaisons, soustractions et séquences ne sont que de l'arithmétique entière en dessous. Le costume est ce qui le rend utilisable - le même nombre s'affiche comme une date, se formate comme une date, et se trace sur un axe de dates.

as.Date() analyse volontiers la disposition ISO "AAAA-MM-JJ" sans aide, ce qui est l'une des bonnes raisons de stocker les dates ainsi dans tes fichiers. Une habitude à prendre tôt : une analyse ratée renvoie NA en silence - pas une erreur - alors jette toujours un œil au résultat après avoir analysé quelque chose de nouveau.

Les chaînes qui ressemblent à des dates ne sont que des chaînes : "2026-08-07" < "2026-11-01" se compare correctement par chance, parce que l'ordre ISO coïncide avec l'ordre alphabétique, mais "07/08/2026" se trie n'importe comment. Convertis d'abord, compare ensuite.

Analyser d'autres dispositions avec format =

Le monde n'écrit pas les dates en ISO. Pour tout le reste, as.Date() prend un argument format = : une recette décrivant la chaîne entrante, construite avec des codes %.

Les trois donnent le même jour. La recette doit correspondre exactement à la chaîne, séparateurs compris : "%d/%m/%Y" n'analysera pas "07-08-2026". Les codes que tu utiliseras vraiment :

CodeSignificationExemple
%YAnnée sur 4 chiffres2026
%yAnnée sur 2 chiffres26
%mNuméro du mois08
%dJour du mois07
%bNom du mois abrégéAug
%BNom du mois completAugust
%aJour de la semaine abrégéFri
%AJour de la semaine completFriday
%HHeure (00-23)14
%MMinute30
%SSeconde05

L'embuscade classique est justement "07/08/2026" : jour/mois/année dans la plupart du monde, mois/jour/année aux États-Unis, et R ne peut pas deviner ce que veut dire ton fichier. Pire, une mauvaise supposition « marche » souvent - les deux lectures sont des dates valides - jusqu'à ce que le 13 d'un mois arrive et donne NA (il n'y a pas de treizième mois). Connais la convention de tes données avant d'écrire la recette.

Formater les dates en sortie

format() est l'image miroir d'as.Date() : les mêmes codes %, dans l'autre sens - Date en entrée, chaîne en sortie.

Utilise ça pour les titres de rapports, les étiquettes et les noms de fichiers - format(Sys.Date(), "%Y-%m-%d") produit des noms qui se trient chronologiquement. Deux détails à connaître : %d complète avec un zéro (« August 07 »), et %B/%A produisent des noms dans la langue de ton système - une session configurée en allemand affiche « Freitag » au lieu de « Friday ». Garde le formatage aux extrémités de ton script, pour les humains ; en interne, laisse les dates être des Dates.

Arithmétique des dates et séquences

Comme une Date est un compte de jours, l'arithmétique marche comme tu l'espères. Soustraire deux dates donne un objet difftime :

Trois habitudes à tirer de ce bloc. D'abord, enveloppe un difftime dans as.numeric() avant de calculer avec - un difftime porte un attribut d'unités qui peut surprendre les calculs ultérieurs. Ensuite, quand les unités comptent, énonce-les avec difftime(units = ) au lieu d'accepter ce que R choisit. Enfin, ajouter un simple nombre revient à ajouter des jours - il n'y a pas de + 1 mois en R de base, parce qu'« un mois » n'est pas un nombre fixe de jours.

Pour avancer en tenant compte du calendrier, utilise seq(), qui comprend "day", "week", "month", "quarter" et "year" :

Les séquences mensuelles sont l'outil standard pour les périodes de rapport et les graduations d'axes. Une bizarrerie : démarre une séquence mensuelle le 31 et R continue de compter de vrais jours à travers les mois qui n'en ont pas, si bien que l'entrée « février » atterrit début mars. Ancre les séquences mensuelles au 1er et dérive tout le reste à partir de là.

Extraire des parties d'une date

R de base a deux extracteurs de confort et un idiome général. weekdays() et months() renvoient des noms ; pour des nombres, fais un aller-retour par format() :

Le geste format()-puis-as.integer() a l'air détourné, mais c'est l'idiome standard de R de base, et il est vectorisé - donne-lui toute une colonne de dates et tu récupères toute une colonne d'années. C'est exactement ce que tu veux après avoir importé un jeu de données daté depuis un fichier CSV : analyse la colonne de dates une fois avec as.Date(), puis dérive des colonnes d'année et de mois pour le groupement.

Quand les jours ne suffisent pas : POSIXct, et lubridate

Date n'a aucune notion d'heure. Dès que tes données comportent des horodatages - entrées de journal, relevés de capteurs, « commande passée à 14h32 » - il te faut POSIXct, la classe date-heure de R : des secondes depuis 1970 au lieu de jours, et une conscience des fuseaux horaires.

Tout se transpose : les mêmes codes % (avec maintenant %H, %M, %S) valent pour l'analyse et pour format(), la soustraction donne des difftimes, Sys.time() c'est « maintenant ». Le nouveau fardeau est le fuseau horaire - passe tz = explicitement à l'analyse, parce que deux sessions dans des fuseaux différents liraient sinon la même chaîne comme deux instants différents. Et résiste à l'envie de stocker des données calendaires en POSIXct « au cas où » : un anniversaire stocké à minuit-dans-un-certain-fuseau peut s'afficher comme la veille dans un autre fuseau, un bug réellement pénible à retracer. Jours entiers : Date. Instants : POSIXct.

Enfin, le package lubridate est le visage plus avenant que la plupart du code tidyverse met sur tout ce qui précède - à adopter une fois que la mécanique de base a du sens :

library(lubridate)

ymd("2026-08-07")            # order-based parsing: no format string
mdy("08/07/2026")            # ...you just say which order the parts come in
dmy("7 August 2026")
floor_date(Sys.Date(), "month")   # snap to the start of the period

ymd(), mdy() et dmy() remplacent les recettes de format par un simple énoncé de l'ordre des parties, et floor_date() résout « groupe ces horodatages par mois » en un appel. lubridate repose sur les mêmes classes Date/POSIXct en dessous - un meilleur volant, pas un autre moteur.

Ce que tu retiens

  • Une Date est un compte de jours depuis le 1970-01-01 habillé pour s'afficher comme une date ; unclass() montre le nombre.
  • as.Date("2026-08-07") analyse directement l'ISO ; tout le reste demande une recette format = de codes % - et une analyse ratée renvoie NA, en silence.
  • format(date, "...") est l'inverse : les mêmes codes, produisant des chaînes d'affichage.
  • La soustraction donne un difftime - fixe units = explicitement, as.numeric() avant de calculer. + n ajoute des jours ; pour des mois, utilise seq(by = "month").
  • weekdays(), months() et l'idiome as.integer(format(...)) extraient les parties, de façon vectorisée.
  • Date pour les jours entiers, POSIXct (avec un tz explicite) pour les horodatages ; lubridate rend les deux plus agréables.

Prochaine étape : que faire quand R te crie dessus - lire les messages d'erreur et les déboguer méthodiquement.

Questions fréquentes

Comment convertir une chaîne en date en R ?

Avec as.Date(). Si la chaîne est au format ISO, ça marche tout seul : as.Date("2026-08-07"). Toute autre disposition nécessite une recette format = construite avec des codes % : as.Date("07/08/2026", format = "%d/%m/%Y"). Une analyse ratée renvoie NA plutôt qu'une erreur, alors vérifie le résultat.

Comment obtenir la date du jour en R ?

Sys.Date() renvoie aujourd'hui sous forme d'objet Date ; Sys.time() renvoie la date-heure courante en POSIXct. Les deux viennent de l'horloge et des réglages de fuseau horaire de ton ordinateur.

Comment calculer la différence entre deux dates en R ?

Soustrais-les : as.Date("2026-08-07") - as.Date("2026-01-01") donne un difftime de 218 jours. Enveloppe-le dans as.numeric() pour utiliser le nombre dans un calcul, ou appelle difftime(d1, d2, units = "weeks") pour choisir toi-même les unités au lieu de laisser R décider.

Quelle est la différence entre Date et POSIXct en R ?

Date stocke des jours entiers (en interne : les jours depuis le 1970-01-01) et ne sait rien des heures ni des fuseaux horaires. POSIXct stocke un instant dans le temps (les secondes depuis 1970) et connaît les fuseaux horaires. Utilise Date pour des données calendaires comme des anniversaires et des échéances ; n'utilise POSIXct que quand l'heure compte, comme pour des horodatages et des journaux.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER