Les dates et heures#

En pratique, il arrive souvent qu’on travaille avec les dates. Pensez seulement à la variable date de naissance qu’on retrouve dans toutes les bases de données.

La fonction qui nous donne la date courante dans R est la suivante:

Sys.Date()

Celle qui nous donne l’heure;

Sys.time()
[1] "2024-04-03 08:59:42 EDT"

Assignons le temps actuel à la variable time_1

time_1 <- Sys.time()

Bien évidemment, on peut appliquer des aditions et soustractions aux dates

Sys.Date()+1 # pour la date de demain
Sys.Date()- 1 # pour la date d'hier

Toutefois, les mêmes opérations se font par secondes lorsqu’on utilise Sys.time()

time_1
[1] "2024-04-03 08:59:42 EDT"
time_1+1
[1] "2024-04-03 08:59:43 EDT"
time_1-60
[1] "2024-04-03 08:58:42 EDT"

Lorsqu’on veut soustraire une heure à notre temps, on soustrait alors 3600 secondes!

time_1+3600
[1] "2024-04-03 09:59:42 EDT"

Lorsque le résultat apparait à l’écran, à première vue, nous avons l’impression que nous obtenons un type caractère. Vérifions alors le type avec la fonction class

class(Sys.Date())
'Date'

On voit bien que le type du résultat obtenu est bien date. Mai pour le temps, nous obtenons toute autre chose.

class(Sys.time())
  1. 'POSIXct'
  2. 'POSIXt'

Ce qu’on obtient s’appelle un objet « POSIXct ». On peut considérer cela comme numérique, et ce temps change numériquement en secondes depuis 1970.

Vérifions cela en forçant le format avec la fonction as.numeric

as.numeric(Sys.time())
1712149182.66215

Alors que si nous forçons un format de type caractère;

as.character(Sys.time())
'2024-04-03 08:59:42.666754'

Nous obtenons presque le même résultat qu’au début, mais cette fois avec le type caractère.

weekdays#

il est possible d’avoir le jour courant avec la fonction weekdays()

Créons d’abord un vecteur contenant les dates des deux dernières semaines.

dates_2sem<-Sys.Date()- 1:10
dates_2sem
Sys.setlocale()
'en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8'
weekdays(dates_2sem)
  1. 'Tuesday'
  2. 'Monday'
  3. 'Sunday'
  4. 'Saturday'
  5. 'Friday'
  6. 'Thursday'
  7. 'Wednesday'
  8. 'Tuesday'
  9. 'Monday'
  10. 'Sunday'

Si l’on veut afficher en français, nous devons alors changer l’affichage local. Un package appelé lubridate nous permet de le faire facilement

require("lubridate")
Sys.setlocale(locale="fr_FR.UTF-8")
Loading required package: lubridate
Attaching package: ‘lubridate’
The following objects are masked from ‘package:base’:

    date, intersect, setdiff, union
'fr_FR.UTF-8/fr_FR.UTF-8/fr_FR.UTF-8/C/fr_FR.UTF-8/en_US.UTF-8'
weekdays(dates_2sem)
  1. 'Mardi'
  2. 'Lundi'
  3. 'Dimanche'
  4. 'Samedi'
  5. 'Vendredi'
  6. 'Jeudi'
  7. 'Mercredi'
  8. 'Mardi'
  9. 'Lundi'
  10. 'Dimanche'

months#

Et les mois avec la fonction months

months(dates_2sem)
  1. 'avril'
  2. 'avril'
  3. 'mars'
  4. 'mars'
  5. 'mars'
  6. 'mars'
  7. 'mars'
  8. 'mars'
  9. 'mars'
  10. 'mars'

seq#

On se rappelle de la fonction seq qui sert à générer une séquence d’objets incrémentés d’une unité quelconque. Utilisons cette fonction afin de générer toutes les dates du jour entre deux dates données.

Par exemple entre la date du premier cours et la date du dernier cours;

seq(from = as.Date("06/09/17", "%d/%m/%y"), to = as.Date("13/12/17","%d/%m/%y"), by = "day")

Et si nous voulions toutes les dates de chaque cours (à chaque semaine)

seq(from = as.Date("06/09/17", "%d/%m/%y"), to = as.Date("13/12/17","%d/%m/%y"), by = "week")

Faites la même chose pour les dates de démo par exemple, sachant la première démo avait commencé le 19 septembre

seq(from = as.Date("19/09/17", "%d/%m/%y"), to = as.Date("12/12/17","%d/%m/%y"), by = "week")

difftime#

Si on veut savoir combien de temps s’est passé entre deux variables (d’heure) données, on deux options;

La première consiste à simplement soustraire la première variable de la deuxième;

time_2<-Sys.time()
time_2 - time_1
Time difference of 0.2059798 secs

L’aute option est d’utiliser la fonctin difftime

difftime(time_1, time_2)
Time difference of -0.2059798 secs
difftime(time_2, time_1)
Time difference of 0.2059798 secs

On peut ajouter l’argument units afin d’afficher les unités voulues

difftime(time_2, time_1, units='sec')
Time difference of 0.2059798 secs

Si l’on veut seulement le résultat en chiffre, on peut le transformer en valeur numérique tel que nous avons appris

as.numeric(difftime(time_2, time_1, units='sec'))
0.205979824066162

Toutes ces fonctions de dates sont importantes lorsqu’on veut travailler sur des problèmes traitant les séries temporelles par exemple