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"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.
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 |
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ą.
Pavyzdžiui, laiko momentą galima nurodyti tūkstantųjų sekundžių tikslumu. Toks laiko užrašymas atitinka “%H:%M:%OS3” formatą.
Turint laiko momentą, galima parodyti, koks vietinio laiko skirtumas nuo laiko pagal Grinvičą. Papildomai nurodome, kad būtų parodomas ir laiko zonos kodas.
Naudojant funkciją format(), tą patį laiką galima “pervesti” į kitą laiko juostą. R kalboje naudojama taip vadinama Olson laiko zonų duomenų bazė (TZ database).
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.
Š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.
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 |.
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.
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:
.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.
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.
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ą.
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.
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] TRUEIš tokio sąrašo galima gauti atskiras datos arba laiko komponentes. Pavyzdžiui, valandas, minutes ir sekundes, savaitės dienos ar metų dienos numerį.
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ą.
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ą.
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:
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ą.
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.
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.
format(b, "%T", usetz = TRUE, tz = "Asia/Tokyo")
#> [1] "09:00:25 JST"POSIXct ir POSIXlt formato laiko objektus.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?Į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.
Tos pačios datos gali būti užrašytos kitokiu formatu, pvz. datos dalys atskirtos pasviru brūkšneliu.
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.
# 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().
c("1918 2 mėn. 16 d.", "1990 3 mėn. 11 d."). Šį datų vektorių paverskite į POSIX laiko objektą.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().
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ą.
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ą.
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"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.
# 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:
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"