Datum och tider
7.1 Introduktion
Att arbeta med datum och tider kan vara omständligt. Detta förklaras av att datum och tid är tämligen komplicerade ämnen. Att hantera år, månader, sommartid, vintertid, tidszoner och geografiska skillnader i kalendrar kan vara ganska komplicerat. R har inbyggda funktioner för att hantera datum och tid men dessa funktioner är ofta svåra att använda. Därför skapades lubridate
som innehåller en rad funktioner som gör hantering av datum och tid betydligt enklare.
Vi kommer aktivera två paket nu:
library(tidyverse)
library(lubridate)
I lubridate kan du definiera tre datum- eller tidsvariabler:
- date: date är ett datum med år, månad och dag. I en tibble kallas detta <date>.
- time: time är ett klockslag. I en tibble kallas detta <time>. För att hantera klockslag används paketet
hms
. - datetime: en datetime innehåller både datum och time. I en tibble kallas detta <dttm>.
Använd inte datetime om du inte måste. Om du använder datetime kan du eventuellt behöva beakta tidszoner för att beräkningar skall bli korrekta (se nedan).
För att få veta vilket som är dagens datum skrives följande kommando:
today()
[1] "2022-11-09"
För att få veta vilken datumtid som föreligger skrives följande kommando:
now()
[1] "2022-11-09 21:11:39 CET"
Lubridate lagrar datum som antalet dagar sedan ett referensdatum som är 1970-01-01 00:00:00 GMT
. Vi kan beräkna vilket datum som förelåg 10000 dagar sedan detta referensdatum genom att använda funktionen as_date()
:
as_date(10000)
[1] "1997-05-19"
Med funktionen as_datetime() kan du beräkna datumtiden i sekunder från referensdatumet:
as_datetime(3600)
[1] "1970-01-01 01:00:00 UTC"
I de allra flesta fall får vi datum och datumtider i form av textsträngar. För att kunna använda lubridate behöver vi beakta ordningen på tidselementen (år, månad, dag, timme, minut, sekunder). Därefter kan vi välja en lubridate funktion som kan läsa in datumet eller datumtiden korrekt. I tabellen nedan ser du några exempel på olika sätt att skriva datumet 31 december år 2020, och motsvarande lubridate
funktion som klarar att läsa in datumet:
Datumformat | Ordning på tidselement | 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() |
Låt oss testa det genom att skapa en data frame med tre individer, inklusive deras namn, födelsedatum, undersökningsdatum och dödsdatum. Alla datum kommer att skrivas på olika sätt för att testa funktionen ymd()
:
# Skapa 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å ihop vektorer till 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
Låt oss ändra ordningen på år, månad och dag i våra datum. Detta är oproblematiskt så länge vi byter funktion i lubridate:
# Dag, månad, år
dmy("31-12-2022")
[1] "2022-12-31"
# Månad, dag, år
mdy("12-31-2022")
[1] "2022-12-31"
# År, månad, dag
ymd("20221231")
[1] "2022-12-31"
# Blandade strängar
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 förstod varenda datumsträng!
I nästa exempel lagrar vi ett datum som inkluderar ett klockslag (datumtid). För att läsa detta korrekt lägger vi till bokstäverna h (timme), m (minuter) och s (sekunder) enligt följande:
ymd_hms("2011-06-04 12:00:00")
[1] "2011-06-04 12:00:00 UTC"
Här finns också möjlighet att specificera den exakta kombinationen av tidselementen:
mdy_hm("12/31/2022 10:35")
[1] "2022-12-31 10:35:00 UTC"
R tilldelade datumet tidszonen UTC. R kan hantera cirka 600 tidszoner, inklusive zonernas sommartider, vintertider och historiska kalendervariationer. Du kan få en lista över alla tidszoner genom att skriva följande:
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"
Låt oss ange tidszonen till 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 Från enskilda komponenter
Om tidselementen finns i flera kolumner kan funktionerna make_date()
och make_datetime()
användas för att skapa datum respektive datumtider. Låt oss aktivera paketet nycflights13 för att använda inbygda data på flygplansresor.
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 skapar vi ett datum med kolumnerna year, month och day. Den nya datumkolumnen kallas 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 gör vi om det med en datumtid. För detta behövs kolumner med hour, minute och seconds. Den nya kolumnen kommer kallas 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 Extrahera komponenter
Du kan extrahera komponenter i datum och datumtider med extraktionsfunktionerna i lubridate. De har namn som är intuitiva och exempel följer här nedan:
Först definierar vi en datumtid som är klockan 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 extraherar vi en komponent i taget:
year(datetime) # årtal
[1] 2022
month(datetime, label = TRUE) # månad med namn
[1] Nov
12 Levels: Jan < Feb < Mar < Apr < May < Jun < Jul < Aug < Sep < ... < Dec
month(datetime) # månad med siffra
[1] 11
mday(datetime) # månaden
[1] 30
week(datetime) # veckonummer
[1] 48
hour(datetime) # timman
[1] 12
minute(datetime) # minuten
[1] 0
yday(datetime) # dagen på året
[1] 334
wday(datetime, label = TRUE) # veckodagen med namn
[1] Wed
Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
wday(datetime) # veckodagen med siffra
[1] 4
7.2.1 Avrudning
Datum kan avrundas med funktionerna floor_date()
, round_date()
, och ceiling_date()
.
7.2.2 Modifiera tidselementen
Du kan modifiera tidselementen i datum och datumtider:
# Skapa en datumtid:
datetime <- ymd_hms("2022-12-30 00:00:00")
datetime
[1] "2022-12-30 UTC"
# Ändra året till 2025
year(datetime) <- 2025
datetime
[1] "2025-12-30 UTC"
# Ändra månaden till januari
month(datetime) <- 01
datetime
[1] "2025-01-30 UTC"
# Lägg till en timme på timman
hour(datetime) <- hour(datetime) + 1
datetime
[1] "2025-01-30 01:00:00 UTC"
Med funktionen update()
kan du modifiera flera datumkomponenter samtidigt:
datetime <- update(datetime, year = 2030, month = 2, mday = 2, hour = 2)
datetime
[1] "2030-02-02 02:00:00 UTC"
Om värdena är för stora kommer de att rulla över:
7.3 Durationer, perioder och intervaller
Datum kan användas för att beräkna durationer, perioder och intervaller.
- duration: en duration är ett antal sekunder eller dagar.
- period: en period har veckor eller månader.
- intervall: ett intervall har en startpunkt och en slutpunkt.
7.3.1 Durationer
När differensen mellan två datum beräknas skapas ett objekt av typen difftime. Låt oss beräkna differensen mellan 1991-08-22 och idag:
age <- today() - ymd("1991-08-22")
age
Time difference of 11402 days
Differensen kan också beräknas med funktionen difftime()
:
difftime(today(), ymd("1991-08-22"))
Time difference of 11402 days
Funktionen as.duration() är mer förutsägbar än difftime eftersom as.duration() beräknar alla durationer i sekunder:
as.duration(age)
[1] "985132800s (~31.22 years)"
Med durations-funktionerna kan du beräkna antal sekunder som förlöpt. Exempel följer.
Hur många sekunder finns det på 10 sekunder?
dseconds(10)
[1] "10s"
Antal sekunder på 60 minuter:
dminutes(60)
[1] "3600s (~1 hours)"
Antal sekunder på en timme:
dhours(1)
[1] "3600s (~1 hours)"
Antal sekunder på en dag:
ddays(1)
[1] "86400s (~1 days)"
Antal sekunder på en vecka:
dweeks(1)
[1] "604800s (~1 weeks)"
Antal sekunder på ett år:
dyears(1)
[1] "31557600s (~1 years)"
Att göra beräkningar på sekunder har vissa fördelar. Först och främst blir beräkningen mer exakt. Om man exempelvis använder år som tidsskala så kan man inte använda 365 dagar för att definiera ett år eftersom den genomsnittliga längden på ett år är 365.25 dagar. Vi kan inte heller använda månader som tidsskala eftersom månaderna är olika långa. En sekund är dock alltid en sekund (såvida du inte närmar dig ljusets hastighet eller ett eventhoristonen).
Du kan addera och subtrahera durationer:
dseconds(1) + dhours(1)
[1] "3601s (~1 hours)"
Du kan lägga till och subtrahera durationer till och från dagar:
# Imorgon
today() + ddays(1)
[1] "2022-11-10"
# Förra året
today() - dyears(1)
[1] "2021-11-08 18:00:00 UTC"
7.3.2 Perioder
En period är ett en tidslängd mellan två tidpunkter. En period på 1 timme, 1 dag, 1 månad definieras som följer:
hours(1)
[1] "1H 0M 0S"
days(1)
[1] "1d 0H 0M 0S"
months(1)
[1] "1m 0d 0H 0M 0S"
Du kan addera, subtrahera och multiplicera perioder:
hours(1) + days(1)
[1] "1d 1H 0M 0S"
hours(1) * 2
[1] "2H 0M 0S"
Du kan addera en period till ett befintligt datum eller datumtid:
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 fanns 365 dagar. År 2016 fanns 366 dagar. Att dividera antal dagar år 215 och 2016 på 365 ger därför inte samma resultat. Om du ändå försöker göra det kommer lubridate ge dig en uppskattning. För att veta mer exakt hur många dagar som förlöpt under en specifik period är intervaller bättre. Ett intervall har ett start- och slutdatum.
Intervaller skapas med syntax start %--% slut
:
# Antal dagar år 2015
my_interval_1 <- ymd("2015-01-01") %--% ymd("2016-01-01")
my_interval_1 / days(1)
[1] 365
# Antal dagar år 2016
my_interval_2 <- ymd("2016-01-01") %--% ymd("2017-01-01")
my_interval_2 / days(1)
[1] 366
7.4 Din tidszon
Din nuvarande tidszon kan kontrolleras som följer:
Sys.timezone()
[1] "Europe/Stockholm"