Dates et heures

Dates et heures

7.1 Introduction

Travailler avec des dates et des heures peut être fastidieux, car les dates et le temps sont des sujets assez complexes. Gérer les années, les mois, l'heure d'été, l'heure d'hiver, les fuseaux horaires et les différences géographiques entre calendriers peut s'avérer assez compliqué. R dispose de fonctions intégrées pour manipuler les dates et les heures, mais ces fonctions sont souvent difficiles à utiliser. C'est pourquoi lubridate a été créé : ce package contient une série de fonctions qui simplifient considérablement la manipulation des dates et des heures.

Nous allons maintenant charger deux packages :

library(tidyverse)
library(lubridate)

Dans lubridate, vous pouvez définir trois types de variables de date ou de temps :

  • date : une date comporte une année, un mois et un jour. Dans un tibble, ce type est noté <date>.
  • time : time est une heure de la journée. Dans un tibble, ce type est noté <time>. Pour manipuler les heures de la journée, on utilise le package hms.
  • datetime : une datetime contient à la fois une date et une heure (time). Dans un tibble, ce type est noté <dttm>.

N'utilisez pas datetime si ce n'est pas nécessaire. Si vous utilisez datetime, vous devrez éventuellement tenir compte des fuseaux horaires pour que les calculs soient corrects (voir ci-dessous).

Pour connaître la date du jour, on saisit la commande suivante :

today()
[1] "2022-11-09"

Pour connaître la date-heure actuelle, on saisit la commande suivante :

now()
[1] "2022-11-09 21:11:39 CET"

Lubridate stocke les dates sous la forme du nombre de jours écoulés depuis une date de référence, 1970-01-01 00:00:00 GMT. Nous pouvons calculer la date correspondant à 10 000 jours après cette date de référence à l'aide de la fonction [as_date()](https://lubridate.tidyverse.org/reference/as_date.html) :

as_date(10000)
[1] "1997-05-19"

La fonction as_datetime() permet de calculer la date-heure à partir d'un nombre de secondes écoulées depuis la date de référence :

as_datetime(3600)
[1] "1970-01-01 01:00:00 UTC"

Dans la grande majorité des cas, les dates et les dates-heures nous parviennent sous forme de chaînes de caractères. Pour pouvoir utiliser lubridate, il faut tenir compte de l'ordre des éléments temporels (année, mois, jour, heure, minute, secondes). On peut ensuite choisir une fonction de lubridate capable de lire correctement la date ou la date-heure. Le tableau ci-dessous présente quelques exemples de différentes façons d'écrire la date du 31 décembre 2020, ainsi que la fonction lubridate correspondante capable de lire cette date :

Format de date Ordre des éléments temporels Fonction de lubridate
2020-12-31 YYYY-MM-DD ymd()
2020/12/31 YYYY/MM/DD ymd()
20201231 YYYYMMDD ymd()
20-12-31 YY-MM-DD ymd()
201231 YYMMDD ymd()

Formats de date et fonctions lubridate correspondantes.

Testons cela en créant un data frame de trois individus, comprenant leur nom, leur date de naissance, leur date d'examen et leur date de décès. Toutes les dates seront écrites de manière différente afin de tester la fonction [ymd()](https://lubridate.tidyverse.org/reference/ymd.html) :

## Créer des vecteurs
name <- c("David", "Mohammed", "Christina")
birth_date <- ymd("1990-01-01", "1999-01-04", "2002-05-05")
examination_date <- ymd("1990.01.01", "1999.01.04", "2002.05.05")
death_date <- ymd("2005/02/02", "2009/11/14", "2018/01/01")

## Combiner les vecteurs en un data frame
my_data <- data.frame(name, birth_date, examination_date, death_date)

## Afficher le data frame
my_data
       name birth_date examination_date death_date
1     David 1990-01-01       1990-01-01 2005-02-02
2  Mohammed 1999-01-04       1999-01-04 2009-11-14
3 Christina 2002-05-05       2002-05-05 2018-01-01

Modifions l'ordre de l'année, du mois et du jour dans nos dates. Cela ne pose aucun problème tant que l'on change de fonction dans lubridate :

## Jour, mois, année
dmy("31-12-2022")
[1] "2022-12-31"
## Mois, jour, année
mdy("12-31-2022")
[1] "2022-12-31"
## Année, mois, jour
ymd("20221231")
[1] "2022-12-31"
## Chaînes hétérogènes
mdy("December 31st 2022")
[1] "2022-12-31"
mdy("December, 31st, 2022")
[1] "2022-12-31"
dmy("31-Dec-2022")
[1] "2022-12-31"
dmy("31*Dec*2022")
[1] "2022-12-31"

Lubridate a compris chacune de ces chaînes de dates !

Dans l'exemple suivant, nous stockons une date qui comprend une heure (date-heure). Pour la lire correctement, nous ajoutons les lettres h (heure), m (minutes) et s (secondes) comme suit :

ymd_hms("2011-06-04 12:00:00")
[1] "2011-06-04 12:00:00 UTC"

Il est également possible de spécifier la combinaison exacte des éléments temporels :

mdy_hm("12/31/2022 10:35")
[1] "2022-12-31 10:35:00 UTC"

R a attribué à la date le fuseau horaire UTC. R peut gérer environ 600 fuseaux horaires, y compris leurs heures d'été, leurs heures d'hiver et les variations historiques de calendrier. Vous pouvez obtenir la liste de tous les fuseaux horaires en saisissant :

OlsonNames()
  [1] "Africa/Abidjan"                   "Africa/Accra"
  [3] "Africa/Addis_Ababa"               "Africa/Algiers"
  [5] "Africa/Asmara"                    "Africa/Asmera"
  [7] "Africa/Bamako"                    "Africa/Bangui"
  [9] "Africa/Banjul"                    "Africa/Bissau"
 [11] "Africa/Blantyre"                  "Africa/Brazzaville"
 [13] "Africa/Bujumbura"                 "Africa/Cairo"
 [15] "Africa/Casablanca"                "Africa/Ceuta"
 [17] "Africa/Conakry"                   "Africa/Dakar"
 [19] "Africa/Dar_es_Salaam"             "Africa/Djibouti"
 [21] "Africa/Douala"                    "Africa/El_Aaiun"
 [23] "Africa/Freetown"                  "Africa/Gaborone"
 [25] "Africa/Harare"                    "Africa/Johannesburg"
 [27] "Africa/Juba"                      "Africa/Kampala"
 [29] "Africa/Khartoum"                  "Africa/Kigali"
 [31] "Africa/Kinshasa"                  "Africa/Lagos"
 [33] "Africa/Libreville"                "Africa/Lome"
 [35] "Africa/Luanda"                    "Africa/Lubumbashi"
 [37] "Africa/Lusaka"                    "Africa/Malabo"
 [39] "Africa/Maputo"                    "Africa/Maseru"
 [41] "Africa/Mbabane"                   "Africa/Mogadishu"
 [43] "Africa/Monrovia"                  "Africa/Nairobi"
 [45] "Africa/Ndjamena"                  "Africa/Niamey"
 [47] "Africa/Nouakchott"                "Africa/Ouagadougou"
 [49] "Africa/Porto-Novo"                "Africa/Sao_Tome"
 [51] "Africa/Timbuktu"                  "Africa/Tripoli"
 [53] "Africa/Tunis"                     "Africa/Windhoek"
 [55] "America/Adak"                     "America/Anchorage"
 [57] "America/Anguilla"                 "America/Antigua"
 [59] "America/Araguaina"                "America/Argentina/Buenos_Aires"
 [61] "America/Argentina/Catamarca"      "America/Argentina/ComodRivadavia"
 [63] "America/Argentina/Cordoba"        "America/Argentina/Jujuy"
 [65] "America/Argentina/La_Rioja"       "America/Argentina/Mendoza"
 [67] "America/Argentina/Rio_Gallegos"   "America/Argentina/Salta"
 [69] "America/Argentina/San_Juan"       "America/Argentina/San_Luis"
 [71] "America/Argentina/Tucuman"        "America/Argentina/Ushuaia"
 [73] "America/Aruba"                    "America/Asuncion"
 [75] "America/Atikokan"                 "America/Atka"
 [77] "America/Bahia"                    "America/Bahia_Banderas"
 [79] "America/Barbados"                 "America/Belem"
 [81] "America/Belize"                   "America/Blanc-Sablon"
 [83] "America/Boa_Vista"                "America/Bogota"
 [85] "America/Boise"                    "America/Buenos_Aires"
 [87] "America/Cambridge_Bay"            "America/Campo_Grande"
 [89] "America/Cancun"                   "America/Caracas"
 [91] "America/Catamarca"                "America/Cayenne"
 [93] "America/Cayman"                   "America/Chicago"
 [95] "America/Chihuahua"                "America/Coral_Harbour"
 [97] "America/Cordoba"                  "America/Costa_Rica"
 [99] "America/Creston"                  "America/Cuiaba"
[101] "America/Curacao"                  "America/Danmarkshavn"
[103] "America/Dawson"                   "America/Dawson_Creek"
[105] "America/Denver"                   "America/Detroit"
[107] "America/Dominica"                 "America/Edmonton"
[109] "America/Eirunepe"                 "America/El_Salvador"
[111] "America/Ensenada"                 "America/Fort_Nelson"
[113] "America/Fort_Wayne"               "America/Fortaleza"
[115] "America/Glace_Bay"                "America/Godthab"
[117] "America/Goose_Bay"                "America/Grand_Turk"
[119] "America/Grenada"                  "America/Guadeloupe"
[121] "America/Guatemala"                "America/Guayaquil"
[123] "America/Guyana"                   "America/Halifax"
[125] "America/Havana"                   "America/Hermosillo"
[127] "America/Indiana/Indianapolis"     "America/Indiana/Knox"
[129] "America/Indiana/Marengo"          "America/Indiana/Petersburg"
[131] "America/Indiana/Tell_City"        "America/Indiana/Vevay"
[133] "America/Indiana/Vincennes"        "America/Indiana/Winamac"
[135] "America/Indianapolis"             "America/Inuvik"
[137] "America/Iqaluit"                  "America/Jamaica"
[139] "America/Jujuy"                    "America/Juneau"
[141] "America/Kentucky/Louisville"      "America/Kentucky/Monticello"
[143] "America/Knox_IN"                  "America/Kralendijk"
[145] "America/La_Paz"                   "America/Lima"
[147] "America/Los_Angeles"              "America/Louisville"
[149] "America/Lower_Princes"            "America/Maceio"
[151] "America/Managua"                  "America/Manaus"
[153] "America/Marigot"                  "America/Martinique"
[155] "America/Matamoros"                "America/Mazatlan"
[157] "America/Mendoza"                  "America/Menominee"
[159] "America/Merida"                   "America/Metlakatla"
[161] "America/Mexico_City"              "America/Miquelon"
[163] "America/Moncton"                  "America/Monterrey"
[165] "America/Montevideo"               "America/Montreal"
[167] "America/Montserrat"               "America/Nassau"
[169] "America/New_York"                 "America/Nipigon"
[171] "America/Nome"                     "America/Noronha"
[173] "America/North_Dakota/Beulah"      "America/North_Dakota/Center"
[175] "America/North_Dakota/New_Salem"   "America/Nuuk"
[177] "America/Ojinaga"                  "America/Panama"
[179] "America/Pangnirtung"              "America/Paramaribo"
[181] "America/Phoenix"                  "America/Port_of_Spain"
[183] "America/Port-au-Prince"           "America/Porto_Acre"
[185] "America/Porto_Velho"              "America/Puerto_Rico"
[187] "America/Punta_Arenas"             "America/Rainy_River"
[189] "America/Rankin_Inlet"             "America/Recife"
[191] "America/Regina"                   "America/Resolute"
[193] "America/Rio_Branco"               "America/Rosario"
[195] "America/Santa_Isabel"             "America/Santarem"
[197] "America/Santiago"                 "America/Santo_Domingo"
[199] "America/Sao_Paulo"                "America/Scoresbysund"
[201] "America/Shiprock"                 "America/Sitka"
[203] "America/St_Barthelemy"            "America/St_Johns"
[205] "America/St_Kitts"                 "America/St_Lucia"
[207] "America/St_Thomas"                "America/St_Vincent"
[209] "America/Swift_Current"            "America/Tegucigalpa"
[211] "America/Thule"                    "America/Thunder_Bay"
[213] "America/Tijuana"                  "America/Toronto"
[215] "America/Tortola"                  "America/Vancouver"
[217] "America/Virgin"                   "America/Whitehorse"
[219] "America/Winnipeg"                 "America/Yakutat"
[221] "America/Yellowknife"              "Antarctica/Casey"
[223] "Antarctica/Davis"                 "Antarctica/DumontDUrville"
[225] "Antarctica/Macquarie"             "Antarctica/Mawson"
[227] "Antarctica/McMurdo"               "Antarctica/Palmer"
[229] "Antarctica/Rothera"               "Antarctica/South_Pole"
[231] "Antarctica/Syowa"                 "Antarctica/Troll"
[233] "Antarctica/Vostok"                "Arctic/Longyearbyen"
[235] "Asia/Aden"                        "Asia/Almaty"
[237] "Asia/Amman"                       "Asia/Anadyr"
[239] "Asia/Aqtau"                       "Asia/Aqtobe"
[241] "Asia/Ashgabat"                    "Asia/Ashkhabad"
[243] "Asia/Atyrau"                      "Asia/Baghdad"
[245] "Asia/Bahrain"                     "Asia/Baku"
[247] "Asia/Bangkok"                     "Asia/Barnaul"
[249] "Asia/Beirut"                      "Asia/Bishkek"
[251] "Asia/Brunei"                      "Asia/Calcutta"
[253] "Asia/Chita"                       "Asia/Choibalsan"
[255] "Asia/Chongqing"                   "Asia/Chungking"
[257] "Asia/Colombo"                     "Asia/Dacca"
[259] "Asia/Damascus"                    "Asia/Dhaka"
[261] "Asia/Dili"                        "Asia/Dubai"
[263] "Asia/Dushanbe"                    "Asia/Famagusta"
[265] "Asia/Gaza"                        "Asia/Harbin"
[267] "Asia/Hebron"                      "Asia/Ho_Chi_Minh"
[269] "Asia/Hong_Kong"                   "Asia/Hovd"
[271] "Asia/Irkutsk"                     "Asia/Istanbul"
[273] "Asia/Jakarta"                     "Asia/Jayapura"
[275] "Asia/Jerusalem"                   "Asia/Kabul"
[277] "Asia/Kamchatka"                   "Asia/Karachi"
[279] "Asia/Kashgar"                     "Asia/Kathmandu"
[281] "Asia/Katmandu"                    "Asia/Khandyga"
[283] "Asia/Kolkata"                     "Asia/Krasnoyarsk"
[285] "Asia/Kuala_Lumpur"                "Asia/Kuching"
[287] "Asia/Kuwait"                      "Asia/Macao"
[289] "Asia/Macau"                       "Asia/Magadan"
[291] "Asia/Makassar"                    "Asia/Manila"
[293] "Asia/Muscat"                      "Asia/Nicosia"
[295] "Asia/Novokuznetsk"                "Asia/Novosibirsk"
[297] "Asia/Omsk"                        "Asia/Oral"
[299] "Asia/Phnom_Penh"                  "Asia/Pontianak"
[301] "Asia/Pyongyang"                   "Asia/Qatar"
[303] "Asia/Qostanay"                    "Asia/Qyzylorda"
[305] "Asia/Rangoon"                     "Asia/Riyadh"
[307] "Asia/Saigon"                      "Asia/Sakhalin"
[309] "Asia/Samarkand"                   "Asia/Seoul"
[311] "Asia/Shanghai"                    "Asia/Singapore"
[313] "Asia/Srednekolymsk"               "Asia/Taipei"
[315] "Asia/Tashkent"                    "Asia/Tbilisi"
[317] "Asia/Tehran"                      "Asia/Tel_Aviv"
[319] "Asia/Thimbu"                      "Asia/Thimphu"
[321] "Asia/Tokyo"                       "Asia/Tomsk"
[323] "Asia/Ujung_Pandang"               "Asia/Ulaanbaatar"
[325] "Asia/Ulan_Bator"                  "Asia/Urumqi"
[327] "Asia/Ust-Nera"                    "Asia/Vientiane"
[329] "Asia/Vladivostok"                 "Asia/Yakutsk"
[331] "Asia/Yangon"                      "Asia/Yekaterinburg"
[333] "Asia/Yerevan"                     "Atlantic/Azores"
[335] "Atlantic/Bermuda"                 "Atlantic/Canary"
[337] "Atlantic/Cape_Verde"              "Atlantic/Faeroe"
[339] "Atlantic/Faroe"                   "Atlantic/Jan_Mayen"
[341] "Atlantic/Madeira"                 "Atlantic/Reykjavik"
[343] "Atlantic/South_Georgia"           "Atlantic/St_Helena"
[345] "Atlantic/Stanley"                 "Australia/ACT"
[347] "Australia/Adelaide"               "Australia/Brisbane"
[349] "Australia/Broken_Hill"            "Australia/Canberra"
[351] "Australia/Currie"                 "Australia/Darwin"
[353] "Australia/Eucla"                  "Australia/Hobart"
[355] "Australia/LHI"                    "Australia/Lindeman"
[357] "Australia/Lord_Howe"              "Australia/Melbourne"
[359] "Australia/North"                  "Australia/NSW"
[361] "Australia/Perth"                  "Australia/Queensland"
[363] "Australia/South"                  "Australia/Sydney"
[365] "Australia/Tasmania"               "Australia/Victoria"
[367] "Australia/West"                   "Australia/Yancowinna"
[369] "Brazil/Acre"                      "Brazil/DeNoronha"
[371] "Brazil/East"                      "Brazil/West"
[373] "Canada/Atlantic"                  "Canada/Central"
[375] "Canada/Eastern"                   "Canada/Mountain"
[377] "Canada/Newfoundland"              "Canada/Pacific"
[379] "Canada/Saskatchewan"              "Canada/Yukon"
[381] "CET"                              "Chile/Continental"
[383] "Chile/EasterIsland"               "CST6CDT"
[385] "Cuba"                             "EET"
[387] "Egypt"                            "Eire"
[389] "EST"                              "EST5EDT"
[391] "Etc/GMT"                          "Etc/GMT-0"
[393] "Etc/GMT-1"                        "Etc/GMT-10"
[395] "Etc/GMT-11"                       "Etc/GMT-12"
[397] "Etc/GMT-13"                       "Etc/GMT-14"
[399] "Etc/GMT-2"                        "Etc/GMT-3"
[401] "Etc/GMT-4"                        "Etc/GMT-5"
[403] "Etc/GMT-6"                        "Etc/GMT-7"
[405] "Etc/GMT-8"                        "Etc/GMT-9"
[407] "Etc/GMT+0"                        "Etc/GMT+1"
[409] "Etc/GMT+10"                       "Etc/GMT+11"
[411] "Etc/GMT+12"                       "Etc/GMT+2"
[413] "Etc/GMT+3"                        "Etc/GMT+4"
[415] "Etc/GMT+5"                        "Etc/GMT+6"
[417] "Etc/GMT+7"                        "Etc/GMT+8"
[419] "Etc/GMT+9"                        "Etc/GMT0"
[421] "Etc/Greenwich"                    "Etc/UCT"
[423] "Etc/Universal"                    "Etc/UTC"
[425] "Etc/Zulu"                         "Europe/Amsterdam"
[427] "Europe/Andorra"                   "Europe/Astrakhan"
[429] "Europe/Athens"                    "Europe/Belfast"
[431] "Europe/Belgrade"                  "Europe/Berlin"
[433] "Europe/Bratislava"                "Europe/Brussels"
[435] "Europe/Bucharest"                 "Europe/Budapest"
[437] "Europe/Busingen"                  "Europe/Chisinau"
[439] "Europe/Copenhagen"                "Europe/Dublin"
[441] "Europe/Gibraltar"                 "Europe/Guernsey"
[443] "Europe/Helsinki"                  "Europe/Isle_of_Man"
[445] "Europe/Istanbul"                  "Europe/Jersey"
[447] "Europe/Kaliningrad"               "Europe/Kiev"
[449] "Europe/Kirov"                     "Europe/Kyiv"
[451] "Europe/Lisbon"                    "Europe/Ljubljana"
[453] "Europe/London"                    "Europe/Luxembourg"
[455] "Europe/Madrid"                    "Europe/Malta"
[457] "Europe/Mariehamn"                 "Europe/Minsk"
[459] "Europe/Monaco"                    "Europe/Moscow"
[461] "Europe/Nicosia"                   "Europe/Oslo"
[463] "Europe/Paris"                     "Europe/Podgorica"
[465] "Europe/Prague"                    "Europe/Riga"
[467] "Europe/Rome"                      "Europe/Samara"
[469] "Europe/San_Marino"                "Europe/Sarajevo"
[471] "Europe/Saratov"                   "Europe/Simferopol"
[473] "Europe/Skopje"                    "Europe/Sofia"
[475] "Europe/Stockholm"                 "Europe/Tallinn"
[477] "Europe/Tirane"                    "Europe/Tiraspol"
[479] "Europe/Ulyanovsk"                 "Europe/Uzhgorod"
[481] "Europe/Vaduz"                     "Europe/Vatican"
[483] "Europe/Vienna"                    "Europe/Vilnius"
[485] "Europe/Volgograd"                 "Europe/Warsaw"
[487] "Europe/Zagreb"                    "Europe/Zaporozhye"
[489] "Europe/Zurich"                    "Factory"
[491] "GB"                               "GB-Eire"
[493] "GMT"                              "GMT-0"
[495] "GMT+0"                            "GMT0"
[497] "Greenwich"                        "Hongkong"
[499] "HST"                              "Iceland"
[501] "Indian/Antananarivo"              "Indian/Chagos"
[503] "Indian/Christmas"                 "Indian/Cocos"
[505] "Indian/Comoro"                    "Indian/Kerguelen"
[507] "Indian/Mahe"                      "Indian/Maldives"
[509] "Indian/Mauritius"                 "Indian/Mayotte"
[511] "Indian/Reunion"                   "Iran"
[513] "Israel"                           "Jamaica"
[515] "Japan"                            "Kwajalein"
[517] "Libya"                            "MET"
[519] "Mexico/BajaNorte"                 "Mexico/BajaSur"
[521] "Mexico/General"                   "MST"
[523] "MST7MDT"                          "Navajo"
[525] "NZ"                               "NZ-CHAT"
[527] "Pacific/Apia"                     "Pacific/Auckland"
[529] "Pacific/Bougainville"             "Pacific/Chatham"
[531] "Pacific/Chuuk"                    "Pacific/Easter"
[533] "Pacific/Efate"                    "Pacific/Enderbury"
[535] "Pacific/Fakaofo"                  "Pacific/Fiji"
[537] "Pacific/Funafuti"                 "Pacific/Galapagos"
[539] "Pacific/Gambier"                  "Pacific/Guadalcanal"
[541] "Pacific/Guam"                     "Pacific/Honolulu"
[543] "Pacific/Johnston"                 "Pacific/Kanton"
[545] "Pacific/Kiritimati"               "Pacific/Kosrae"
[547] "Pacific/Kwajalein"                "Pacific/Majuro"
[549] "Pacific/Marquesas"                "Pacific/Midway"
[551] "Pacific/Nauru"                    "Pacific/Niue"
[553] "Pacific/Norfolk"                  "Pacific/Noumea"
[555] "Pacific/Pago_Pago"                "Pacific/Palau"
[557] "Pacific/Pitcairn"                 "Pacific/Pohnpei"
[559] "Pacific/Ponape"                   "Pacific/Port_Moresby"
[561] "Pacific/Rarotonga"                "Pacific/Saipan"
[563] "Pacific/Samoa"                    "Pacific/Tahiti"
[565] "Pacific/Tarawa"                   "Pacific/Tongatapu"
[567] "Pacific/Truk"                     "Pacific/Wake"
[569] "Pacific/Wallis"                   "Pacific/Yap"
[571] "Poland"                           "Portugal"
[573] "PRC"                              "PST8PDT"
[575] "ROC"                              "ROK"
[577] "Singapore"                        "Turkey"
[579] "UCT"                              "Universal"
[581] "US/Alaska"                        "US/Aleutian"
[583] "US/Arizona"                       "US/Central"
[585] "US/East-Indiana"                  "US/Eastern"
[587] "US/Hawaii"                        "US/Indiana-Starke"
[589] "US/Michigan"                      "US/Mountain"
[591] "US/Pacific"                       "US/Samoa"
[593] "UTC"                              "W-SU"
[595] "WET"                              "Zulu"
attr(,"Version")
[1] "2022f"

Définissons le fuseau horaire sur GMT (Greenwich Mean Time) :

ymd_hms("2011-06-04 12:00:00", tz="GMT")
[1] "2011-06-04 12:00:00 GMT"
ymd_hms("2017-01-31 20:11:59")
[1] "2017-01-31 20:11:59 UTC"
mdy_hm("01/31/2017 08:01")
[1] "2017-01-31 08:01:00 UTC"

7.1.1 À partir de composants individuels

Si les éléments temporels sont répartis dans plusieurs colonnes, les fonctions [make_date()](https://lubridate.tidyverse.org/reference/make_datetime.html) et [make_datetime()](https://lubridate.tidyverse.org/reference/make_datetime.html) permettent de créer respectivement des dates et des dates-heures. Chargeons le package nycflights13 afin d'utiliser ses données intégrées sur les vols aériens.

year <- c(2021, 2022)
month <- c(1, 12)
day <- c(1, 31)

mina_datum <- data.frame(year, month, day)

mina_datum
  year month day
1 2021     1   1
2 2022    12  31

Nous créons maintenant une date à partir des colonnes year, month et day. La nouvelle colonne de date s'appelle my_date :

mina_datum$my_date <- make_date(mina_datum$year, mina_datum$month, mina_datum$day)

## Afficher le résultat
mina_datum
  year month day    my_date
1 2021     1   1 2021-01-01
2 2022    12  31 2022-12-31

Recommençons maintenant avec une date-heure. Il faut pour cela des colonnes hour, minute et seconds. La nouvelle colonne s'appellera my_datetime :

year <- c(2021, 2022)
month <- c(1, 12)
day <- c(1, 31)
hour <- c(10, 12)
minute <- c(19, 24)
seconds <- c(11, 45)

mina_datum <- data.frame(year, month, day, hour, minute, seconds)

mina_datum$my_datetime <- make_datetime(mina_datum$year,
                                        mina_datum$month,
                                        mina_datum$day,
                                        mina_datum$hour,
                                        mina_datum$minute,
                                        mina_datum$seconds)

## Afficher le résultat
mina_datum
  year month day hour minute seconds         my_datetime
1 2021     1   1   10     19      11 2021-01-01 10:19:11
2 2022    12  31   12     24      45 2022-12-31 12:24:45

7.2 Extraire des composants

Vous pouvez extraire les composants des dates et des dates-heures à l'aide des fonctions d'extraction de lubridate. Leurs noms sont intuitifs ; en voici quelques exemples :

Définissons d'abord une date-heure correspondant à 12:00:00 le 31 décembre 2022 :

datetime <- ymd_hms("2022-11-30 12:00:00")
datetime
[1] "2022-11-30 12:00:00 UTC"

Extrayons maintenant un composant à la fois :

year(datetime) # année
[1] 2022
month(datetime, label = TRUE) # mois avec son nom
[1] Nov
12 Levels: Jan < Feb < Mar < Apr < May < Jun < Jul < Aug < Sep < ... < Dec
month(datetime) # mois en chiffre
[1] 11
mday(datetime) # le mois
[1] 30
week(datetime) # numéro de semaine
[1] 48
hour(datetime) # l'heure
[1] 12
minute(datetime) # la minute
[1] 0
yday(datetime) # jour de l'année
[1] 334
wday(datetime, label = TRUE) # jour de la semaine avec son nom
[1] Wed
Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
wday(datetime) # jour de la semaine en chiffre
[1] 4

7.2.1 Arrondi

Les dates peuvent être arrondies à l'aide des fonctions [floor_date()](https://lubridate.tidyverse.org/reference/round_date.html), [round_date()](https://lubridate.tidyverse.org/reference/round_date.html), et [ceiling_date()](https://lubridate.tidyverse.org/reference/round_date.html).

7.2.2 Modifier les éléments temporels

Vous pouvez modifier les éléments temporels des dates et des dates-heures :

## Créer une date-heure :
datetime <- ymd_hms("2022-12-30 00:00:00")
datetime
[1] "2022-12-30 UTC"
## Changer l'année en 2025
year(datetime) <- 2025
datetime
[1] "2025-12-30 UTC"
## Changer le mois en janvier
month(datetime) <- 01
datetime
[1] "2025-01-30 UTC"
## Ajouter une heure à l'heure
hour(datetime) <- hour(datetime) + 1
datetime
[1] "2025-01-30 01:00:00 UTC"

La fonction [update()](https://rdrr.io/r/stats/update.html) permet de modifier plusieurs composants de date simultanément :

datetime <- update(datetime, year = 2030, month = 2, mday = 2, hour = 2)
datetime
[1] "2030-02-02 02:00:00 UTC"

Si les valeurs sont trop grandes, elles seront reportées sur l'unité supérieure :

7.3 Durées, périodes et intervalles

Les dates permettent de calculer des durées, des périodes et des intervalles.

  • durée : une durée est un nombre de secondes ou de jours.
  • période : une période comporte des semaines ou des mois.
  • intervalle : un intervalle possède un point de départ et un point d'arrivée.

7.3.1 Durées

Le calcul de la différence entre deux dates crée un objet de type difftime. Calculons la différence entre le 1991-08-22 et aujourd'hui :

age <- today() - ymd("1991-08-22")
age
Time difference of 11402 days

La différence peut également être calculée avec la fonction [difftime()](https://rdrr.io/r/base/difftime.html) :

difftime(today(), ymd("1991-08-22"))
Time difference of 11402 days

La fonction as.duration() est plus prévisible que difftime, car as.duration() calcule toutes les durées en secondes :

as.duration(age)
[1] "985132800s (~31.22 years)"

Les fonctions de durée permettent de calculer le nombre de secondes écoulées. Voici quelques exemples.

Combien de secondes y a-t-il dans 10 secondes ?

dseconds(10)
[1] "10s"

Nombre de secondes dans 60 minutes :

dminutes(60)
[1] "3600s (~1 hours)"

Nombre de secondes dans une heure :

dhours(1)
[1] "3600s (~1 hours)"

Nombre de secondes dans une journée :

ddays(1)
[1] "86400s (~1 days)"

Nombre de secondes dans une semaine :

dweeks(1)
[1] "604800s (~1 weeks)"

Nombre de secondes dans une année :

dyears(1)
[1] "31557600s (~1 years)"

Effectuer les calculs en secondes présente certains avantages. Tout d'abord, le calcul est plus exact. Si l'on utilise par exemple l'année comme échelle de temps, on ne peut pas définir une année comme 365 jours, puisque la durée moyenne d'une année est de 365,25 jours. On ne peut pas non plus utiliser les mois comme échelle de temps, car les mois n'ont pas tous la même longueur. Une seconde, en revanche, reste toujours une seconde (à moins que vous n'approchiez la vitesse de la lumière ou un horizon des événements).

Vous pouvez additionner et soustraire des durées :

dseconds(1) + dhours(1)
[1] "3601s (~1 hours)"

Vous pouvez ajouter des durées à des dates et en soustraire :

## Demain
today() + ddays(1)
[1] "2022-11-10"
## L'année dernière
today() - dyears(1)
[1] "2021-11-08 18:00:00 UTC"

7.3.2 Périodes

Une période est une durée entre deux instants. Une période de 1 heure, 1 jour et 1 mois se définit comme suit :

hours(1)
[1] "1H 0M 0S"
days(1)
[1] "1d 0H 0M 0S"
months(1)
[1] "1m 0d 0H 0M 0S"

Vous pouvez additionner, soustraire et multiplier des périodes :

hours(1) + days(1)
[1] "1d 1H 0M 0S"
hours(1) * 2
[1] "2H 0M 0S"

Vous pouvez ajouter une période à une date ou à une date-heure existante :

ymd("2022-12-01") + ddays(1)
[1] "2022-12-02"
ymd("2022-12-01") + days(1)
[1] "2022-12-02"

7.3.3 Intervalles

L'année 2015 comptait 365 jours. L'année 2016 en comptait 366. Diviser le nombre de jours des années 215 et 2016 par 365 ne donne donc pas le même résultat. Si vous tentez malgré tout de le faire, lubridate vous fournira une estimation. Pour savoir plus exactement combien de jours se sont écoulés au cours d'une période donnée, les intervalles sont préférables. Un intervalle possède une date de début et une date de fin.

Les intervalles se créent avec la syntaxe start %--% slut :

## Nombre de jours en 2015
my_interval_1 <- ymd("2015-01-01") %--% ymd("2016-01-01")
my_interval_1 / days(1)
[1] 365
## Nombre de jours en 2016
my_interval_2 <- ymd("2016-01-01") %--% ymd("2017-01-01")
my_interval_2 / days(1)
[1] 366

7.4 Votre fuseau horaire

Votre fuseau horaire actuel peut être vérifié comme suit :

Sys.timezone()
[1] "Europe/Stockholm"