14  Datų ir laiko formatai

R turi keletą standartinių datos ir laiko nustatymo funkcijų: kai kurios iš jų parodo tik datą, kitos parodo ir datą, ir laiką. Kadangi data arba laikas gali būti užrašomi kaip paprastas tekstas arba užrašomi naudojant tam skirtus datos ir laiko formatus, šių funkcijų reikšmė yra vis kitokio tipo.

Kodas
date()
#> [1] "Wed Nov 26 20:37:41 2025"
Sys.Date()
#> [1] "2025-11-26"
Sys.time()
#> [1] "2025-11-26 20:37:42 EET"
Sys.timezone()
#> [1] "Europe/Vilnius"

Datos ir laiko užrašymui naudojami tam tikri standartiniai pažymėjimai. Keletą iš jų galima paminėti:

Tipas Žymėjimas Atitikmuo
Metai %Y metai
%y metai (be pirmųjų dviejų skaičių)
Mėnuo %m mėnesio numeris
%B mėnesio pavadinimas
%b sutrumpintas mėnesio pavadinimas
Diena %d dienos numeris
%e dienos numeris (be nulio priekyje)
Laikas %H valandos (00–23)
%I valandos (00-12)
%p AM/PM
%M minutės (00–59)
%S sekundės (00–61)
%OS sekundės su dešimtaine dalimi
Kita %W metų savaitės numeris
%A savaitės dienos pavadinimas
%a sutrumpintas savaitės dienos pavadinimas
%w savaitės dienos numeris (sekmadienis 0)
%Z laiko zona
%z laiko pokytis nuo GMT
%C amžius, šimtmetis

Kai kurios šalys turi savo datos ir laiko užrašymo formatą. Laikantis ISO 8601 standarto, metai, mėnuo ir dienos atskiriami brūkšneliu, tačiau Lietuvoje gali būti atskiriami ir tašku. Dėl tos priežasties data bei laikas gali būti rodomi prisitaikant prie lokalės:

Žymėjimas Atitikmuo
%X laikas pagal vietinio laiko užrašymo taisykles
%x data pagal vietinio laiko užrašymo taisykles

Dažniausiai pasitaikančios laiko elementų kombinacijos turi savus pažymėjimus:

Žymėjimas Atitikmuo
%T %H:%M:%S
%R %H:%M
%F %Y-%m-%d
%D %m/%d/%y
%c %a %b %e %H:%M:%S %Y

14.1 Standartinės datos ir laiko funkcijos

Kiekviena sisteminio laiko ir datos funkcija datą rodo tam tikru savo formatu, tačiau tą pačią datą galima užrašyti keliais skirtingais būdais. Tam naudojama funkcija format(). Jos parametrai:

Argumentas Reikšmė
x data
format datos formatas
tz laiko zona
usetz loginis, ar rodyti laiko zoną

Pavyzdžiui, šios dienos datą galima užrašyti taip: mėnuo-diena, savaitės diena. Toks datos užrašymo pavidalas atitinka “%m-%d, %A” formatą.

Kodas
format(Sys.Date(), format = "%m-%d, %A")
#> [1] "11-26, trečiadienis"

Pavyzdžiui, laiko momentą galima nurodyti tūkstantųjų sekundžių tikslumu. Toks laiko užrašymas atitinka “%H:%M:%OS3” formatą.

Kodas
format(Sys.time(), format = "%H:%M:%OS3")
#> [1] "20:37:43.304"

Turint laiko momentą, galima parodyti, koks vietinio laiko skirtumas nuo laiko pagal Grinvičą. Papildomai nurodome, kad būtų parodomas ir laiko zonos kodas.

Kodas
format(Sys.time(), format = "%z", usetz = TRUE)
#> [1] "+0200 EET"

Naudojant funkciją format(), tą patį laiką galima “pervesti” į kitą laiko juostą. R kalboje naudojama taip vadinama Olson laiko zonų duomenų bazė (TZ database).

Kodas
OlsonNames()[1:10]
#>  [1] "Africa/Abidjan"     "Africa/Accra"       "Africa/Addis_Ababa"
#>  [4] "Africa/Algiers"     "Africa/Asmara"      "Africa/Asmera"     
#>  [7] "Africa/Bamako"      "Africa/Bangui"      "Africa/Banjul"     
#> [10] "Africa/Bissau"

Pavyzdžiui, užfiksuosime laiko momentą ir atvaizduosime jį Vilniaus, Tokijo ir Londono laiku.

Kodas
t <- Sys.time()
t
#> [1] "2025-11-26 20:37:43 EET"

format(t, "%T", usetz = TRUE, tz = "Europe/Vilnius")
#> [1] "20:37:43 EET"
format(t, "%T", usetz = TRUE, tz = "Asia/Tokyo")
#> [1] "03:37:43 JST"
format(t, "%T", usetz = TRUE, tz = "Europe/London")
#> [1] "18:37:43 GMT"
Užduotis
  1. Šios dienos datą užrašykite tokiais formatais: a) tik metai, b) tik mėnesio pavadinimas, c) tik diena, d) savaitės diena, mėnesio pavadinimas ir dienos numeris, e) metai, mėnuo ir diena atskirti tašku.

  2. Sisteminį laiką užrašykite tokiu formatu: a) tik data, b) tik laikas c) tik metai, d) valandos ir minutės, e) savaitės numeris, dienos numeris metuose, f) valandos, minutės ir sekundės atskirtos simboliu |.

  3. JAV ir kai kurių kitų valstybių kariuomenės savo tikslams naudoja specifinę laiko sistemą, kur laiko zonų pavadinimai susieti su NATO fonetine abėcėle. Pvz., raidė A žymi “Alpha” laiko zoną, kuri atitinka UTC+1, raidė B “Bravo”, kuri atitinka UTC+2 ir t. t. Sisteminį laiką užrašykite “Zulu” laiko zonoje. Nustatykite, kokį UTC laiką ji atitinka.

14.2 POSIX datos ir laiko formatas

UNIX ir kai kuriose kitose operacinėse sistemose naudojama POSIX laiko sistema. šioje sistemoje laiko momentas nurodomas sekundžių skaičiumi nuo 1970 sausio 1 dienos 00:00:00 val. Tokiu būdu POSIX laikas yra sveikasis skaičius, kuris kas sekundę padidėja vienu vienetu. šia prasme POSIX suderinta su pasaulinio laiko sistema UTC, kurioje laiko vienetas yra sekundė. Paprastai viena para sudaryta iš 86400 sekundžių. Dėl žemės sukimosi lėtėjimo pasaulinis laikas nesutampa su astronominiu laiku, todėl, atliekant sinchronizaciją, prie UTC laiko pridedama papildoma sekundė. Tokios papildomos sekundės POSIX sistemoje neskaičiuojamos, todėl POSIX laikas nėra nei tikrasis astronominis, nei tikrasis pasaulinis UTC laikas. Galima sužinoti, kada buvo pridėtos papildomos sekundės:

Kodas
.leap.seconds
#>  [1] "1972-07-01 GMT" "1973-01-01 GMT" "1974-01-01 GMT" "1975-01-01 GMT"
#>  [5] "1976-01-01 GMT" "1977-01-01 GMT" "1978-01-01 GMT" "1979-01-01 GMT"
#>  [9] "1980-01-01 GMT" "1981-07-01 GMT" "1982-07-01 GMT" "1983-07-01 GMT"
#> [13] "1985-07-01 GMT" "1988-01-01 GMT" "1990-01-01 GMT" "1991-01-01 GMT"
#> [17] "1992-07-01 GMT" "1993-07-01 GMT" "1994-07-01 GMT" "1996-01-01 GMT"
#> [21] "1997-07-01 GMT" "1999-01-01 GMT" "2006-01-01 GMT" "2009-01-01 GMT"
#> [25] "2012-07-01 GMT" "2015-07-01 GMT" "2017-01-01 GMT"

R kalboje naudojami du datos ir laiko formatai: POSIXct ir POSIXlt. Abi klasės atitinka POSIX laiko apibrėžimą - tai teigiamas arba neigiamas skaičius, kuris lygus sekundžių skaičiui nuo 1970-01-01 00:00:00. Viena nuo kitos jos skiriasi tuo, kad POSIXct objektas iš tikro yra skaičius, o POSIXlt objektas - tai toks sąrašas, kurio elementai nurodo atskiras datos ir laiko komponentes:

  • sec – 0–61: sekundės;

  • min – 0–59: minutės;

  • hour – 0–23: valandos;

  • mday – 1–31: mėnesio diena;

  • mon – 0–11: mėnesio numeris metuose;

  • year – metų nuo 1900 skaičius;

  • wday – 0–6: savaitės dienos numeris pradedant sekmadieniu;

  • yday – 0–365: metų dienos numeris;

  • isdst – vasaros laiko indikatorius;

  • zone – laiko zonos identifikatorius (nebūtinas);

  • gmtoff – laiko postūmis sekundėmis nuo GTM (nebūtinas).

Kadangi POSIXct formatu užrašytas laikas yra vienas skaičius, jis užima mažiau vietos ir todėl labiau tinka įvairiems veiksmams su datomis arba jų saugojimui duomenų lentelėse. POSIXlt formatas naudojamas tada, kai iš datos reikia gauti kokią nors vieną atskirą dalį, pvz., savaitės dieną arba dienos numerį metuose.

POSIX objekto klasė keičiama naudojant funkcijas as.POSIXct() ir as.POSIXlt(). Tos funkcijos naudojamos ir POSIX objekto sudarymui iš tekstiniu formatu užrašytos datos. Pagrindiniai argumentai:

Argumentas Reikšmė
x datos objektas, POSIXct arba POSIXlt tipo objektas
tz laiko zona

Funkcija as.POSIXlt(), priklausomai nuo to, koks yra datos objektas, gali turėti dar du parametrus:

Argumentas Reikšmė
format datos formatas, kai x yra character tipo
origin datos atskaitos taškas, kai x yra numeric tipo

Pvz., sudarysime POSIXct klasės vektorių iš %Y-%m-%d %H:%M:%S formatu užrašyto laiko momento. Tarkime, kad laiko zona bus Lietuvos.

Kodas
laikas <- "2015-11-08 14:31:17"
t <- as.POSIXct(laikas, tz = "Europe/Vilnius")
t
#> [1] "2015-11-08 14:31:17 EET"

Matome, kad POSIXct klasės objektas yra double tipo skaičius, kuris ir reiškia sekundžių skaičių nuo 1970-01-01 00:00:00. Galima pastebėti, kad toks objektas turi atributą tzone, kuriam priskirtas laiko zonos pavadinimas.

Kodas
class(t)
#> [1] "POSIXct" "POSIXt"
mode(t)
#> [1] "numeric"
typeof(t)
#> [1] "double"
attributes(t)
#> $class
#> [1] "POSIXct" "POSIXt" 
#> 
#> $tzone
#> [1] "Europe/Vilnius"

Sudarysime to paties laiko momento POSIXlt klasės objektą.

Kodas
t <- as.POSIXlt(laikas, tz = "Europe/Vilnius")
t
#> [1] "2015-11-08 14:31:17 EET"

Nesunkiai galima patikrinti, kad POSIXlt klasės objektas yra laiko komponenčių sąrašas.

Kodas
class(t)
#> [1] "POSIXlt" "POSIXt"
mode(t)
#> [1] "list"
typeof(t)
#> [1] "list"
attributes(t)
#> $names
#>  [1] "sec"    "min"    "hour"   "mday"   "mon"    "year"   "wday"   "yday"  
#>  [9] "isdst"  "zone"   "gmtoff"
#> 
#> $class
#> [1] "POSIXlt" "POSIXt" 
#> 
#> $tzone
#> [1] "Europe/Vilnius"
#> 
#> $balanced
#> [1] TRUE

Iš tokio sąrašo galima gauti atskiras datos arba laiko komponentes. Pavyzdžiui, valandas, minutes ir sekundes, savaitės dienos ar metų dienos numerį.

Kodas
t$sec      # sekundžių skaičius
#> [1] 17
t$year     # metų skaičius nuo 1900 metų
#> [1] 115
t$yday     # dienos metuose numeris (skaičiuojant nuo 0)
#> [1] 311
t$zone     # laiko zonos kodas
#> [1] "EET"

Jei laikas užrašytas nestandartiniu pavidalu, sukuriant POSIXlt klasės objektą, reikia nurodyti jo užrašymo formatą.

Kodas
laikas <- "14:31:17 08/11/2015"
t <- as.POSIXlt(laikas, format = "%H:%M:%S %d/%m/%Y")
t
#> [1] "2015-11-08 14:31:17 EET"

Laiko momentą galima nurodyti sekundžiu skaičiumi nuo tam tikro momento. Pvz., 12 valandų yra 43200 sekundžių. Tegul atskaitos taškas yra 2015-01-01 00:00:00 pagal UTC. Sukursime atitinkamą laiko momentą.

Kodas
laikas <- 12*60*60
t <- as.POSIXlt(laikas, origin = "2015-01-01 00:00:00", tz = "GMT")
t
#> [1] "2015-01-01 12:00:00 GMT"

Laiko momentas paprastai susietas su laiko zona, bet kartais laiko zoną reikia pakeisti. Keičiant laiko zoną galimi du laiko momento perskaičiavimo variantai:

  1. palikti tą patį laiką,
  2. perskaičiuoti laiką.

Pirmuoju atveju, turint POSIXlt klasės objektą, laiko zoną (su tuo pačiu laiko momentu) galima pakeisti konvertuojant į POSIXct klasės objektą ir nurodant naują laiko zoną.

Kodas
t <- as.POSIXlt("2015-11-07 00:00:25", format = "%F %T", tz = "UTC")
t
#> [1] "2015-11-07 00:00:25 UTC"

a <- as.POSIXct(t, tz = "Europe/Vilnius")
a
#> [1] "2015-11-07 00:00:25 EET"

Antruoju atveju, jeigu reikia perskaičiuoti laiką pagal pakeistą laiko zoną, pirmiausia reikia konvertuoti į POSIXct klasės objektą, nekeičiant laiko zonos. Po konvertavimo pakeisti laiko zoną per atributus.

Kodas
b <- as.POSIXct(t)
b
#> [1] "2015-11-07 00:00:25 UTC"

attr(b, "tzone") <- "Europe/Vilnius"
b
#> [1] "2015-11-07 02:00:25 EET"

Jeigu laikas yra POSIXct klasės objektas, pakeisti laiko zoną ir perskaičiuoti laiką galima naudojant funkciją format() – taip gauname tekstinę laiko išraišką. Pavyzdžiui, užrašysime tą patį laiką Tokijo laiku.

Kodas
format(b, "%T", usetz = TRUE, tz = "Asia/Tokyo")
#> [1] "09:00:25 JST"
Užduotis
  1. Tarkime, kad laiko momentas pagal UTC užrašytas taip: “2015.12.12 07|54|25”. Sudarykite POSIXct ir POSIXlt formato laiko objektus.
  2. Sudarykite POSIXct laiko objektą, kuris reiškia laiko momentą praėjus 1 mln. sekundžių nuo dabar. Kokia tai bus mėnesio ir savaitės diena?
  3. Perskaičiuokite ir nustatykite, kokį laiko momentą pagal UTC atitinka laiko momentas “2015-12-12 10:07:26” EET laiko zonoje, kurioje yra ir Lietuva. Kitaip tariant sukurkite laiko momentą UTC laiko zonoje ir konvertuokite į EET laiko zoną.

14.3 POSIXlt objekto sudarymas iš teksto

Įvairiuose duomenų failuose data ir laikas paprastai užrašyti kaip tekstas. Jo konvertavimui į POSIXlt formatą naudojama funkcija strptime(). F-jos parametrai:

Argumentas Reikšmė
x character tipo laiko reikšmių vektorius
format formatas, kuriuo užrašytas laikas
tz laiko zonos kodas

Laikantis ISO 8601 standarto, metai, mėnuo ir diena vienas nuo kito atskiriami brūkšneliu, todėl data nurodoma YYYY-MM-DD formatu, kuris užrašomas “%Y-%m-%d” arba sutrumpintai “%F”. Pavyzdžiui, nuskaitysime tokiu formatu užrašytas datas.

Kodas
x <- c("1961-04-12", "1965-03-18", "1969-07-24")
x
#> [1] "1961-04-12" "1965-03-18" "1969-07-24"

strptime(x, format = "%F")
#> [1] "1961-04-12 MSK" "1965-03-18 MSK" "1969-07-24 MSK"

Tos pačios datos gali būti užrašytos kitokiu formatu, pvz. datos dalys atskirtos pasviru brūkšneliu.

Kodas
x <- c("1961/04/12", "1965/03/18", "1969/07/24")
strptime(x, format = "%Y/%m/%d")
#> [1] "1961-04-12 MSK" "1965-03-18 MSK" "1969-07-24 MSK"

Jei laiko reikšmes reikia įrašyti į tekstinį failą, tai POSIX formatu užrašytą laiką pirmiausia reikia konvertuoti į tekstą. Tam galima naudoti f-ją strftime().

Argumentas Reikšmė
x data, kuri gali būti užrašoma POSIXlt formatu
format datos išvedimo formatas
tz laiko zona
usetz loginis, nustato ar rodyti laiko zoną

Pavyzdžiui, tekstiniu formatu užrašysime Japonijos miestų bombardavimo datas.

Kodas
#       Hiroshima              Nagasaki
#      ---------------------  ---------------------
x <- c("1945-08-06 08:15:00", "1945-08-09 11:02:00")
t <- strptime(x, format = "%Y-%m-%d %H:%M:%S", tz = "Japan")  # POSIX data
class(t)
#> [1] "POSIXlt" "POSIXt"

datos <- strftime(t, format = "%F %T", usetz = TRUE)     # tekstinis tipas
datos
#> [1] "1945-08-06 08:15:00 JST" "1945-08-09 11:02:00 JST"
class(datos)
#> [1] "character"

Laiko ir datos užrašymui tekstiniu formatu galima panaudoti ir funkciją format().

Kodas
datos_f <- format(t, format = "%F %T", usetz = TRUE)
class(datos_f)
#> [1] "character"
Užduotis
  1. Tarkime, kad laiko momentas užrašytas tokiu pavidalu: “2015 12 12 10 40 15”. Matome, kad metai, mėnuo, diena ir t. t. vienas nuo kito atskirti tik tarpo simboliu. Funkcijai strptime nurodykite datos ir laiko užrašymą atitinkantį formatą ir sudarykite POSIX laiko objektą.
  2. Duotas toks datų vektorius: c("1918 2 mėn. 16 d.", "1990 3 mėn. 11 d."). Šį datų vektorių paverskite į POSIX laiko objektą.
  3. Prieš tai gautą POSIX datų vektorių įrašykite į tekstinį failą: a) be laiko zonos, b) tik metus, c) savaitės dieną, mėnuo ir diena.

14.4 POSIXlt objekto sudarymas iš skaičių

Jei visos laiko komponentės – metai, mėnuo diena, valandos, minutės ir sekundės – užrašomos skaičiais, tada POSIXlt klasės laiko momentą sudaryti patogu naudojant funkciją ISOdatetime() arba analogišką jai funkciją ISOdate(). Jų parametrai visi vienodi:

Argumentas Reikšmė
year metai
month mėnuo
day diena
hour valanda
min minutės
sec sekundės
tz laiko zona

Iš esmės šios funkcijos yra vienodos ir skiriasi tik pradinėmis savo parametrų reikšmėmis:

  ISOdatetime(year, month, day, hour, min, sec, tz = "")
  ISOdate    (year, month, day, hour = 12, min = 0, sec = 0, tz = "GMT")

Pirmuoju atveju laiko momentui nustatoma vietinė laiko zona, o antruoju gaunamas laiko momentas pagal pasaulinį UTC laiką.

Kurią funkciją naudoti, priklauso nuo situacijos. Jei reikia užrašyti tikslaus laiko momentą, tada labiau tinka ISOdatetime().

Kodas
ISOdatetime(year = 2015, month = 11, day = 15, hour = 17, min = 48, sec = 18)
#> [1] "2015-11-15 17:48:18 EET"

Jei reikalinga tik data be tikslaus laiko, tada labiau tinka funkcija ISOdate(). Pavyzdžiui, nurodžius tik metus, mėnesį ir dieną, sudaromas tos dienos 12 val. atitinkantis laiko momentas pagal UTC laiką.

Kodas
ISOdate(2015, 11, 15)
#> [1] "2015-11-15 12:00:00 GMT"

Jeigu kuriam nors parametrui priskiriame skaičių seką, galime sugeneruoti datų seką. Pavyzdžiui, sudarysime 2015 metų visų 12-os mėnesių pirmųjų dienų seką.

Kodas
ISOdate(2015, 1:12, 1)
#>  [1] "2015-01-01 12:00:00 GMT" "2015-02-01 12:00:00 GMT"
#>  [3] "2015-03-01 12:00:00 GMT" "2015-04-01 12:00:00 GMT"
#>  [5] "2015-05-01 12:00:00 GMT" "2015-06-01 12:00:00 GMT"
#>  [7] "2015-07-01 12:00:00 GMT" "2015-08-01 12:00:00 GMT"
#>  [9] "2015-09-01 12:00:00 GMT" "2015-10-01 12:00:00 GMT"
#> [11] "2015-11-01 12:00:00 GMT" "2015-12-01 12:00:00 GMT"

14.5 Datos formatas

Tik datą nurodančio objekto sudarymui naudojama f-ja as.Date(). Gaunamas Date klasės vektorius, kurio elementas yra data. Prie tokiu formatu užrašytos datos galima pridėti ar atimti tam tikrą dienų skaičių, galima apskaičiuoti skirtumą tarp dviejų datų.

Priklausomai nuo datos užrašymo tipo (tekstas, skaičius, POSIXct) naudojami skirtingi funkcijos parametrai.

Pvz., tekstinį datų vektorių konvertuosime į Date klasės vektorių. čia visos datos užrašytos standartiniu %Y-%m-%d formatu, kuris ir nurodomas funkcijai.

Kodas
#          Saulės        Durbės        žalgirio      Oršos         Salaspilio
#         ------------  ------------  ------------  ------------  ------------ 
data <- c("1236-09-22", "1260-07-13", "1410-07-15", "1514-09-08", "1605-09-27")

d <- as.Date(x = data, format = "%Y-%m-%d")
d
#> [1] "1236-09-22" "1260-07-13" "1410-07-15" "1514-09-08" "1605-09-27"

class(d)
#> [1] "Date"

Naudojant funkciją format(), tą pačią datą galima pavaizduoti daugeliu skirtingų būdų, pavyzdžiui:

Kodas
format(d, format = "%Y")
#> [1] "1236" "1260" "1410" "1514" "1605"
format(d, format = "%m")
#> [1] "09" "07" "07" "09" "09"
format(d, format = "%d")
#> [1] "22" "13" "15" "08" "27"
format(d, format = "%B")
#> [1] "rugsėjis" "liepa"    "liepa"    "rugsėjis" "rugsėjis"
format(d, format = "%b")
#> [1] "rugs." "liep." "liep." "rugs." "rugs."

format(d, format = "%Y-%m")
#> [1] "1236-09" "1260-07" "1410-07" "1514-09" "1605-09"
format(d, format = "%m-%d")
#> [1] "09-22" "07-13" "07-15" "09-08" "09-27"
format(d, format = "%Y %B")
#> [1] "1236 rugsėjis" "1260 liepa"    "1410 liepa"    "1514 rugsėjis"
#> [5] "1605 rugsėjis"