Datoer og tider
7.1 Introduksjon
Å arbeide med datoer og tider kan være tungvint. Dette skyldes at dato og tid er temmelig kompliserte temaer. Å håndtere år, måneder, sommertid, vintertid, tidssoner og geografiske forskjeller i kalendere kan være ganske komplisert. R har innebygde funksjoner for å håndtere dato og tid, men disse funksjonene er ofte vanskelige å bruke. Derfor ble lubridate laget, en pakke som inneholder en rekke funksjoner som gjør håndtering av dato og tid betydelig enklere.
Vi skal aktivere to pakker nå:
library(tidyverse)
library(lubridate)I lubridate kan du definere tre dato- eller tidsvariabler:
- date: date er en dato med år, måned og dag. I en tibble kalles dette <date>.
- time: time er et klokkeslett. I en tibble kalles dette <time>. For å håndtere klokkeslett brukes pakken
hms. - datetime: en datetime inneholder både dato og time. I en tibble kalles dette <dttm>.
Ikke bruk datetime med mindre du må. Hvis du bruker datetime, kan det hende du må ta hensyn til tidssoner for at beregningene skal bli korrekte (se nedenfor).
For å finne ut hvilken dato det er i dag, skriver du følgende kommando:
today()[1] "2022-11-09"For å finne ut hvilken datotid det er nå, skriver du følgende kommando:
now()[1] "2022-11-09 21:11:39 CET"Lubridate lagrer datoer som antall dager siden en referansedato, som er 1970-01-01 00:00:00 GMT. Vi kan beregne hvilken dato det var 10000 dager etter denne referansedatoen ved å bruke funksjonen [as_date()](https://lubridate.tidyverse.org/reference/as_date.html):
as_date(10000)[1] "1997-05-19"Med funksjonen as_datetime() kan du beregne datotiden i sekunder fra referansedatoen:
as_datetime(3600)[1] "1970-01-01 01:00:00 UTC"I de aller fleste tilfeller får vi datoer og datotider i form av tekststrenger. For å kunne bruke lubridate må vi ta hensyn til rekkefølgen på tidselementene (år, måned, dag, time, minutt, sekunder). Deretter kan vi velge en lubridate-funksjon som kan lese inn datoen eller datotiden korrekt. I tabellen nedenfor ser du noen eksempler på ulike måter å skrive datoen 31. desember 2020 på, og den tilsvarende lubridate-funksjonen som klarer å lese inn datoen:
| Datoformat | Rekkefølge på tidselementer | Funksjon 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-funksjoner.
La oss teste dette ved å lage en data frame med tre individer, inkludert navn, fødselsdato, undersøkelsesdato og dødsdato. Alle datoene skrives på ulike måter for å teste funksjonen [ymd()](https://lubridate.tidyverse.org/reference/ymd.html):
## Lag 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")
## Slå sammen vektorer til 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-01La oss endre rekkefølgen på år, måned og dag i datoene våre. Dette er uproblematisk så lenge vi bytter funksjon 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 strenger
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 forsto hver eneste datostreng!
I neste eksempel lagrer vi en dato som inkluderer et klokkeslett (datotid). For å lese dette korrekt legger vi til bokstavene h (time), m (minutter) og s (sekunder) slik:
ymd_hms("2011-06-04 12:00:00")[1] "2011-06-04 12:00:00 UTC"Her er det også mulig å spesifisere den eksakte kombinasjonen av tidselementer:
mdy_hm("12/31/2022 10:35")[1] "2022-12-31 10:35:00 UTC"R tildelte datoen tidssonen UTC. R kan håndtere omtrent 600 tidssoner, inkludert sonenes sommertider, vintertider og historiske kalendervariasjoner. Du kan få en liste over alle tidssoner ved å 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"La oss sette tidssonen 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 Fra enkeltkomponenter
Hvis tidselementene ligger i flere kolonner, kan funksjonene [make_date()](https://lubridate.tidyverse.org/reference/make_datetime.html) og [make_datetime()](https://lubridate.tidyverse.org/reference/make_datetime.html) brukes til å lage henholdsvis datoer og datotider. La oss aktivere pakken nycflights13 for å bruke innebygde data om flyreiser.
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 31Nå lager vi en dato med kolonnene year, month og day. Den nye datokolonnen kalles 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-31Nå gjør vi det samme med en datotid. Til dette trengs kolonner med hour, minute og seconds. Den nye kolonnen skal hete 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:457.2 Trekke ut komponenter
Du kan trekke ut komponenter i datoer og datotider med uttrekksfunksjonene i lubridate. De har intuitive navn, og eksempler følger nedenfor:
Først definerer vi en datotid som er klokken 12:00:00 den 31. desember 2022:
datetime <- ymd_hms("2022-11-30 12:00:00")
datetime[1] "2022-11-30 12:00:00 UTC"Nå trekker vi ut én komponent om gangen:
year(datetime) # årstall[1] 2022month(datetime, label = TRUE) # måned med navn[1] Nov
12 Levels: Jan < Feb < Mar < Apr < May < Jun < Jul < Aug < Sep < ... < Decmonth(datetime) # måned med tall[1] 11mday(datetime) # måneden[1] 30week(datetime) # ukenummer[1] 48hour(datetime) # timen[1] 12minute(datetime) # minuttet[1] 0yday(datetime) # dagen i året[1] 334wday(datetime, label = TRUE) # ukedagen med navn[1] Wed
Levels: Sun < Mon < Tue < Wed < Thu < Fri < Satwday(datetime) # ukedagen med tall[1] 47.2.1 Avrunding
Datoer kan avrundes med funksjonene [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 Endre tidselementene
Du kan endre tidselementene i datoer og datotider:
## Lag en datotid:
datetime <- ymd_hms("2022-12-30 00:00:00")
datetime[1] "2022-12-30 UTC"## Endre året til 2025
year(datetime) <- 2025
datetime[1] "2025-12-30 UTC"## Endre måneden til januar
month(datetime) <- 01
datetime[1] "2025-01-30 UTC"## Legg til en time på timen
hour(datetime) <- hour(datetime) + 1
datetime[1] "2025-01-30 01:00:00 UTC"Med funksjonen [update()](https://rdrr.io/r/stats/update.html) kan du endre flere datokomponenter samtidig:
datetime <- update(datetime, year = 2030, month = 2, mday = 2, hour = 2)
datetime[1] "2030-02-02 02:00:00 UTC"Hvis verdiene er for store, vil de rulle over:
7.3 Durasjoner, perioder og intervaller
Datoer kan brukes til å beregne durasjoner, perioder og intervaller.
- duration: en durasjon er et antall sekunder eller dager.
- period: en periode har uker eller måneder.
- intervall: et intervall har et startpunkt og et sluttpunkt.
7.3.1 Durasjoner
Når differansen mellom to datoer beregnes, opprettes et objekt av typen difftime. La oss beregne differansen mellom 1991-08-22 og i dag:
age <- today() - ymd("1991-08-22")
ageTime difference of 11402 daysDifferansen kan også beregnes med funksjonen [difftime()](https://rdrr.io/r/base/difftime.html):
difftime(today(), ymd("1991-08-22"))Time difference of 11402 daysFunksjonen as.duration() er mer forutsigbar enn difftime fordi as.duration() beregner alle durasjoner i sekunder:
as.duration(age)[1] "985132800s (~31.22 years)"Med durasjonsfunksjonene kan du beregne antall sekunder som har gått. Eksempler følger.
Hvor mange sekunder er det på 10 sekunder?
dseconds(10)[1] "10s"Antall sekunder på 60 minutter:
dminutes(60)[1] "3600s (~1 hours)"Antall sekunder på en time:
dhours(1)[1] "3600s (~1 hours)"Antall sekunder på en dag:
ddays(1)[1] "86400s (~1 days)"Antall sekunder på en uke:
dweeks(1)[1] "604800s (~1 weeks)"Antall sekunder på et år:
dyears(1)[1] "31557600s (~1 years)"Å gjøre beregninger på sekunder har visse fordeler. Først og fremst blir beregningen mer eksakt. Hvis man for eksempel bruker år som tidsskala, kan man ikke bruke 365 dager for å definere et år, fordi den gjennomsnittlige lengden på et år er 365,25 dager. Vi kan heller ikke bruke måneder som tidsskala, fordi månedene er ulikt lange. Et sekund er imidlertid alltid et sekund (med mindre du nærmer deg lysets hastighet eller en hendelseshorisont).
Du kan addere og subtrahere durasjoner:
dseconds(1) + dhours(1)[1] "3601s (~1 hours)"Du kan legge durasjoner til og trekke dem fra dager:
## I morgen
today() + ddays(1)[1] "2022-11-10"## I fjor
today() - dyears(1)[1] "2021-11-08 18:00:00 UTC"7.3.2 Perioder
En periode er en tidslengde mellom to tidspunkter. En periode på 1 time, 1 dag og 1 måned defineres slik:
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 multiplisere perioder:
hours(1) + days(1)[1] "1d 1H 0M 0S"hours(1) * 2[1] "2H 0M 0S"Du kan legge 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 Intervals
År 2015 hadde 365 dager. År 2016 hadde 366 dager. Å dividere antall dager i år 215 og 2016 med 365 gir derfor ikke samme resultat. Hvis du likevel prøver å gjøre det, vil lubridate gi deg et estimat. For å vite mer eksakt hvor mange dager som har gått i løpet av en bestemt periode, er intervaller bedre. Et intervall har en start- og en sluttdato.
Intervaller lages med syntaksen start %--% slut:
## Antall dager i år 2015
my_interval_1 <- ymd("2015-01-01") %--% ymd("2016-01-01")
my_interval_1 / days(1)[1] 365## Antall dager i år 2016
my_interval_2 <- ymd("2016-01-01") %--% ymd("2017-01-01")
my_interval_2 / days(1)[1] 3667.4 Din tidssone
Den nåværende tidssonen din kan kontrolleres slik:
Sys.timezone()[1] "Europe/Stockholm"