Datoer og tidspunkter

Datoer og tidspunkter

7.1 Introduktion

Det kan være besværligt at arbejde med datoer og tidspunkter. Det skyldes, at dato og tid er ret komplicerede emner. Det kan være temmelig kompliceret at håndtere år, måneder, sommertid, vintertid, tidszoner og geografiske forskelle i kalendere. R har indbyggede funktioner til at håndtere dato og tid, men disse funktioner er ofte svære at bruge. Derfor blev lubridate udviklet. Pakken indeholder en række funktioner, der gør håndteringen af dato og tid betydeligt lettere.

Vi aktiverer nu to pakker:

library(tidyverse)
library(lubridate)

I lubridate kan du definere tre typer dato- eller tidsvariabler:

  • date: date er en dato med år, måned og dag. I en tibble kaldes dette <date>.
  • time: time er et klokkeslæt. I en tibble kaldes dette <time>. Til håndtering af klokkeslæt bruges pakken hms.
  • datetime: en datetime indeholder både dato og time. I en tibble kaldes dette <dttm>.

Brug ikke datetime, medmindre du er nødt til det. Hvis du bruger datetime, kan du eventuelt blive nødt til at tage højde for tidszoner, for at beregningerne bliver korrekte (se nedenfor).

For at få dagens dato skriver du følgende kommando:

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

For at få den aktuelle datotid skriver du følgende kommando:

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

Lubridate gemmer datoer som antallet af dage siden en referencedato, som er 1970-01-01 00:00:00 GMT. Vi kan beregne, hvilken dato det var 10000 dage efter denne referencedato, ved at bruge funktionen [as_date()](https://lubridate.tidyverse.org/reference/as_date.html):

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

Med funktionen as_datetime() kan du beregne datotiden ud fra et antal sekunder efter referencedatoen:

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

I langt de fleste tilfælde får vi datoer og datotider i form af tekststrenge. For at kunne bruge lubridate skal vi tage højde for rækkefølgen af tidselementerne (år, måned, dag, time, minut, sekunder). Derefter kan vi vælge en lubridate-funktion, der kan indlæse datoen eller datotiden korrekt. I tabellen nedenfor ser du nogle eksempler på forskellige måder at skrive datoen 31. december 2020 på og den tilsvarende lubridate-funktion, der kan indlæse datoen:

Datoformat Rækkefølge af tidselementer Funktion i 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()

Datoformater og tilsvarende lubridate-funktioner.

Lad os afprøve det ved at oprette en data frame med tre individer, herunder deres navn, fødselsdato, undersøgelsesdato og dødsdato. Alle datoer skrives på forskellige måder for at afprøve funktionen [ymd()](https://lubridate.tidyverse.org/reference/ymd.html):

## Opret vektorer
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")

## Saml vektorerne i en data frame
my_data <- data.frame(name, birth_date, examination_date, death_date)

## Se 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

Lad os ændre rækkefølgen af år, måned og dag i vores datoer. Det er uproblematisk, så længe vi skifter funktion i lubridate:

## Dag, måned, år
dmy("31-12-2022")
[1] "2022-12-31"
## Måned, dag, år
mdy("12-31-2022")
[1] "2022-12-31"
## År, måned, dag
ymd("20221231")
[1] "2022-12-31"
## Blandede strenge
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 forstod hver eneste datostreng!

I det næste eksempel gemmer vi en dato, der indeholder et klokkeslæt (datotid). For at indlæse den korrekt tilføjer vi bogstaverne h (time), m (minutter) og s (sekunder) på følgende måde:

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

Her er der også mulighed for at angive den nøjagtige kombination af tidselementerne:

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

R tildelte datoen tidszonen UTC. R kan håndtere cirka 600 tidszoner, herunder zonernes sommertider, vintertider og historiske kalendervariationer. Du kan få en liste over alle tidszoner ved at skrive følgende:

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"

Lad os sætte tidszonen til 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 Ud fra enkelte komponenter

Hvis tidselementerne ligger i flere kolonner, kan funktionerne [make_date()](https://lubridate.tidyverse.org/reference/make_datetime.html) og [make_datetime()](https://lubridate.tidyverse.org/reference/make_datetime.html) bruges til at oprette henholdsvis datoer og datotider. Lad os aktivere pakken nycflights13 for at bruge indbyggede data om flyrejser.

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

Nu opretter vi en dato med kolonnerne year, month og day. Den nye datokolonne kaldes my_date:

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

## Se resultatet
mina_datum
  year month day    my_date
1 2021     1   1 2021-01-01
2 2022    12  31 2022-12-31

Nu gentager vi det med en datotid. Til det kræves kolonner med hour, minute og seconds. Den nye kolonne kommer til at hedde 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)

## Se resultatet
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 Udtræk komponenter

Du kan udtrække komponenter af datoer og datotider med udtræksfunktionerne i lubridate. De har intuitive navne, og eksempler følger nedenfor:

Først definerer vi en datotid, som er klokken 12:00:00 den 31. december 2022:

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

Nu udtrækker vi én komponent ad gangen:

year(datetime) # årstal
[1] 2022
month(datetime, label = TRUE) # måned med navn
[1] Nov
12 Levels: Jan < Feb < Mar < Apr < May < Jun < Jul < Aug < Sep < ... < Dec
month(datetime) # måned med tal
[1] 11
mday(datetime) # måneden
[1] 30
week(datetime) # ugenummer
[1] 48
hour(datetime) # timen
[1] 12
minute(datetime) # minuttet
[1] 0
yday(datetime) # dagen i året
[1] 334
wday(datetime, label = TRUE) # ugedagen med navn
[1] Wed
Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
wday(datetime) # ugedagen med tal
[1] 4

7.2.1 Afrunding

Datoer kan afrundes med funktionerne [floor_date()](https://lubridate.tidyverse.org/reference/round_date.html), [round_date()](https://lubridate.tidyverse.org/reference/round_date.html) og [ceiling_date()](https://lubridate.tidyverse.org/reference/round_date.html).

7.2.2 Ændring af tidselementerne

Du kan ændre tidselementerne i datoer og datotider:

## Opret en datotid:
datetime <- ymd_hms("2022-12-30 00:00:00")
datetime
[1] "2022-12-30 UTC"
## Ændr året til 2025
year(datetime) <- 2025
datetime
[1] "2025-12-30 UTC"
## Ændr måneden til januar
month(datetime) <- 01
datetime
[1] "2025-01-30 UTC"
## Læg en time til timen
hour(datetime) <- hour(datetime) + 1
datetime
[1] "2025-01-30 01:00:00 UTC"

Med funktionen [update()](https://rdrr.io/r/stats/update.html) kan du ændre flere datokomponenter på én gang:

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

Hvis værdierne er for store, ruller de over:

7.3 Varigheder, perioder og intervaller

Datoer kan bruges til at beregne varigheder (durations), perioder og intervaller.

  • duration: en duration er et antal sekunder eller dage.
  • period: en periode har uger eller måneder.
  • interval: et interval har et startpunkt og et slutpunkt.

7.3.1 Varigheder

Når forskellen mellem to datoer beregnes, oprettes et objekt af typen difftime. Lad os beregne forskellen mellem 1991-08-22 og i dag:

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

Forskellen kan også beregnes med funktionen [difftime()](https://rdrr.io/r/base/difftime.html):

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

Funktionen as.duration() er mere forudsigelig end difftime, fordi as.duration() beregner alle varigheder i sekunder:

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

Med duration-funktionerne kan du beregne, hvor mange sekunder der er forløbet. Eksempler følger.

Hvor mange sekunder er der på 10 sekunder?

dseconds(10)
[1] "10s"

Antal sekunder på 60 minutter:

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

Antal sekunder på en time:

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

Antal sekunder på en dag:

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

Antal sekunder på en uge:

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

Antal sekunder på et år:

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

Det har visse fordele at foretage beregninger i sekunder. Først og fremmest bliver beregningen mere nøjagtig. Hvis man for eksempel bruger år som tidsskala, kan man ikke bruge 365 dage til at definere et år, fordi den gennemsnitlige længde af et år er 365,25 dage. Vi kan heller ikke bruge måneder som tidsskala, fordi månederne har forskellig længde. Et sekund er dog altid et sekund (medmindre du nærmer dig lysets hastighed eller en begivenhedshorisont).

Du kan addere og subtrahere varigheder:

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

Du kan lægge varigheder til og trække dem fra datoer:

## I morgen
today() + ddays(1)
[1] "2022-11-10"
## Sidste år
today() - dyears(1)
[1] "2021-11-08 18:00:00 UTC"

7.3.2 Perioder

En periode er en tidslængde mellem to tidspunkter. En periode på 1 time, 1 dag og 1 måned defineres på følgende måde:

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

Du kan addere, subtrahere og multiplicere perioder:

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

Du kan lægge en periode til en eksisterende dato eller datotid:

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

7.3.3 Intervaller

År 2015 havde 365 dage. År 2016 havde 366 dage. At dividere antallet af dage i år 215 og 2016 med 365 giver derfor ikke samme resultat. Hvis du alligevel forsøger at gøre det, giver lubridate dig et skøn. For at vide mere nøjagtigt, hvor mange dage der er forløbet i en bestemt periode, er intervaller bedre. Et interval har en start- og en slutdato.

Intervaller oprettes med syntaksen start %--% slut:

## Antal dage i år 2015
my_interval_1 <- ymd("2015-01-01") %--% ymd("2016-01-01")
my_interval_1 / days(1)
[1] 365
## Antal dage i år 2016
my_interval_2 <- ymd("2016-01-01") %--% ymd("2017-01-01")
my_interval_2 / days(1)
[1] 366

7.4 Din tidszone

Du kan kontrollere din nuværende tidszone på følgende måde:

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