ProHoster > Блог > Administracija > Rad sa datumima u R (osnovne mogućnosti, kao i paketi lubridate i timeperiodsR)
Rad sa datumima u R (osnovne mogućnosti, kao i paketi lubridate i timeperiodsR)
Dobijte trenutni datum u bilo kojem programskom jeziku, operacija ekvivalentna "Hello world!" R jezik nije izuzetak.
U ovom članku ćemo pogledati kako rad s datumima funkcionira u osnovnoj sintaksi R jezika, a također ćemo pogledati nekoliko korisnih paketa koji proširuju njegove mogućnosti pri radu s datumima:
lubridate — paket koji vam omogućava da izvršite aritmetička izračunavanja između datuma;
timeperiodsR — paket za rad sa vremenskim intervalima i njihovim komponentama.
Sadržaj
Ako vas zanima analiza podataka, a posebno R jezik, možda će vas zanimati moj telegram и youtube kanala. Većina sadržaja je posvećena R jeziku.
Basic R ima skup funkcija za rad s datumima. Nedostatak osnovne sintakse je u tome što je slučaj imena funkcija i argumenata vrlo raštrkan i praktično nema logičke veze. Međutim, morate znati osnovne funkcije jezika, pa ćemo početi s njima.
Najčešće kada učitavate podatke u R, iz csv datoteka ili drugih izvora, dobijate datum kao tekst. Da biste ovaj tekst pretvorili u ispravan tip podataka, koristite funkciju as.Date().
# создаём текстовый вектор с датами
my_dates <- c("2019-09-01", "2019-09-10", "2019-09-23")
# проверяем тип данных
class(my_dates)
#> [1] "character"
# преобразуем текст в дату
my_dates <- as.Date(my_dates)
# проверяем тип данных
class(my_dates)
#> [1] "Date"
po defaultu as.Date() prihvata datum u dva formata: GGGG-MM-DD ili GGGG/MM/DD.
Ako vaš skup podataka sadrži datume u nekom drugom formatu, možete koristiti argument format.
as.Date("September 26, 2019", format = "%B %d, %Y")
format prihvaća operatore u obliku niza koji označavaju bilo koji vremenski interval i njegov format; najčešće korištene vrijednosti prikazane su u tabeli ispod:
Format
Opis
%d
Broj dana u mjesecu
%a
Skraćenica za naziv dana u sedmici
%A
Puni naziv dana u sedmici
%w
Broj dana u sedmici (0-6, gdje je 0 nedjelja)
%m
Dvocifrena oznaka mjeseca (01-12)
%b
Skraćenica naziva mjeseca (apr, mar,…)
%B
Puni naziv meseca
%y
Dvocifrena oznaka godine
%Y
Četvorocifrena oznaka godine
%j
Broj dana u godini (001 - 366)
%U
Broj sedmice u godini (00 - 53), početak sedmice nedjelja
%W
Broj sedmice u godini (00 - 53), početak sedmice ponedjeljak
Prema tome, „26. septembar 2019.“ je puni naziv mjeseca, datuma i godine. Ovaj format datuma se može opisati pomoću operatora na sljedeći način:"%B %d, %Y".
Gde:
%B — Puni naziv mjeseca
%d — Broj dana u mjesecu
%Y — Četvorocifrena oznaka godine
Kada opisujete format datuma, važno je uključiti sve dodatne znakove iz vašeg niza, kao što su crtice, zarezi, tačke, razmaci i tako dalje. U mom primjeru, "26. septembar 2019.", postoji zarez iza datuma, a također morate staviti zarez u opis formata:"%B %d, %Y".
Postoje situacije kada dobijete datum koji ne samo da ne odgovara standardnim formatima (GGGG-MM-DD ili GGGG/MM/DD), ali i na jeziku koji se razlikuje od zadanog instaliranog na vašem operativnom sistemu. Na primjer, preuzeli ste podatke gdje je datum naznačen ovako: “15. decembar 2019.” Prije pretvaranja ovog stringa u datum, morate promijeniti lokalizaciju.
# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")
Ekstrahiranje komponenti datuma u osnovnom R
Ne postoji mnogo funkcija u osnovnom R-u koje vam omogućavaju da izdvojite bilo koji dio datuma iz objekta klase Datum.
current_date <- Sys.Date() # текущая дата
weekdays(current_date) # получить номер дня недели
months(current_date) # получить номер месяца в году
quarters(current_date) # получить номер квартала в году
Pored glavne klase objekta Datum u osnovnom R postoje još 2 tipa podataka koji pohranjuju vremensku oznaku: POSIXlt, POSIXct. Glavna razlika između ovih klasa i Datum je da pored datuma pohranjuju i vrijeme.
# получить текущую дату и время
current_time <- Sys.time()
# узнать класс объекта current_time
class(current_time)
# "POSIXct" "POSIXt"
funkcija Sys.time() vraća trenutni datum i vrijeme u formatu POSIXct. Ovaj format je sličan po značenju UNIXTIME, i pohranjuje broj sekundi od početka UNIX ere (ponoć (UTC) od 31. decembra 1969. do 1. januara 1970.).
Класс POSIXlt također pohranjuje vrijeme i datum i sve njihove komponente. Dakle, radi se o objektu složenije strukture, ali iz kojeg je lako dobiti bilo koju komponentu datuma i vremena jer zapravo POSIXlt to lista.
# Получаем текущую дату и время
current_time_ct <- Sys.time()
# Преобразуем в формат POSIXlt
current_time_lt <- as.POSIXlt(current_time_ct)
# извлекаем компоненты даты и времени
current_time_lt$sec # секунды
current_time_lt$min # минуты
current_time_lt$hour # часы
current_time_lt$mday # день месяца
current_time_lt$mon # месяц
current_time_lt$year # год
current_time_lt$wday # день недели
current_time_lt$yday # день года
current_time_lt$zone # часовой пояс
Pretvaranje numeričkih i tekstualnih podataka u formate POSIX* provode funkcije as.POSIXct() и as.POSIXlt(). Ove funkcije imaju mali skup argumenata.
x — Broj, string ili objekat klase Datum, koji treba da se konvertuje;
tz — Vremenska zona, zadano "GMT";
format — Opis formata datuma u kojem su predstavljeni podaci proslijeđeni argumentu x;
porijeklo — Koristi se samo kada se broj pretvara u POSIX; ovom argumentu morate proslijediti objekt datuma i vrijeme od kojeg se broje sekunde. Obično se koristi za prijevod sa UNIXTIME-a.
Ako su vaši podaci o datumu i vremenu u UNIXTIME, zatim da ih pretvorite u jasan, čitljiv datum, koristite sljedeći primjer:
# Конвертируем UNIXTIME в читаемую дату
as.POSIXlt(1570084639, origin = "1970-01-01")
U poreklu možete odrediti bilo koju vremensku oznaku. Na primjer, ako vaši podaci sadrže datum i vrijeme kao broj sekundi od 15. septembra 2019. 12:15 popodne, onda da biste ih pretvorili u datum koristite:
# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123, origin = "2019-09-15 12:15:00")
Rad sa hurmama koristeći lubridate paket
lubridate Možda najpopularniji paket za rad sa datumima u jeziku R. Nudi vam tri dodatne klase.
durations — trajanje, tj. broj sekundi između dvije vremenske oznake;
periodi - periodi vam omogućavaju da izračunate između datuma u ljudskim čitljivim intervalima: dani, mjeseci, sedmice itd.;
intervali - objekti koji obezbeđuju početnu i završnu tačku u vremenu.
Instalacija dodatnih paketa na jeziku R vrši se pomoću standardne funkcije install.packages().
Instaliranje paketa lubridate:
install.packages("lubridate")
Pretvorite tekst u datum koristeći lubridate
Karakteristike paketa lubridate značajno pojednostavljuju proces pretvaranja teksta u datum, a također vam omogućavaju da izvršite sve aritmetičke operacije s datumima i vremenima.
Funkcije će vam pomoći da dobijete trenutni datum ili datum i vrijeme today() и now().
today() # текущая дата
now() # текущая дата и время
Za pretvaranje niza u datum u lubridate Postoji čitava porodica funkcija čija se imena uvijek sastoje od tri slova i označavaju redoslijed komponenti datuma:
y - godina
m - mjesec
d - dan
Lista funkcija za pretvaranje teksta u datum putem lubridate-a
ymd()
ydm()
mdy()
myd()
dmy()
dym()
yq()
Neki primjeri za pretvaranje nizova u datume:
ymd("2017 jan 21")
mdy("March 20th, 2019")
dmy("1st april of 2018")
Kao što možete vidjeti lubridate Mnogo je efikasnije u prepoznavanju opisa datuma kao teksta i omogućava vam da konvertujete tekst u datum bez upotrebe dodatnih operatora za opisivanje formata.
Ekstrahiranje komponenti datuma pomoću paketa za podmazivanje
Takođe koristeći lubridate možete dobiti bilo koju komponentu iz datuma:
dt <- ymd("2017 jan 21")
year(dt) # год
month(dt) # месяц
mday(dt) # день в месяце
yday(dt) # день в году
wday(dt) # день недели
Aritmetičke operacije s datumima
Ali najvažnija i osnovna funkcionalnost lubridate je sposobnost izvođenja različitih aritmetičkih operacija s datumima.
Zaokruživanje datuma obavljaju tri funkcije:
floor_date — zaokruživanje na najbliže prošlo vrijeme
ceiling_date — zaokruživanje na blisko buduće vreme
round_date - zaokruživanje na najbliže vrijeme
Svaka od ovih funkcija ima argument jedinicakoji vam omogućava da odredite jedinicu zaokruživanja: sekunda, minuta, sat, dan, sedmica, mjesec, dva mjeseca, tromjesečje, godišnje doba, polugodište, godina
dt <- ymd("2017 jan 21")
round_date(dt, unit = "month") # округлить до месяца
round_date(dt, unit = "3 month") # округлить до 3 месяцев
round_date(dt, unit = "quarter") # округлить до квартала
round_date(dt, unit = "season") # округлить до сезона
round_date(dt, unit = "halfyear") # округлить до полугодия
Dakle, hajde da shvatimo kako da dobijemo datum koji je 8 dana nakon trenutnog datuma i uradimo razne druge aritmetičke proračune između dva datuma.
today() + days(8) # какая дата будет через 8 дней
today() - months(2) # какая дата была 2 месяца назад
today() + weeks(12) # какая дата будет через 12 недель
today() - years(2) # какая дата была 2 года назад
Pojednostavljen rad sa periodima, vremenskim periodimaR paketom.
timeperiodsR — novi paket za rad sa datumima koji je objavljen na CRAN-u u septembru 2019.
Instaliranje paketa timeperiodsR:
install.packages("timeperiodsR")
Glavna svrha je brzo određivanje određenog vremenskog intervala u odnosu na dati datum. Na primjer, koristeći njegove funkcije možete jednostavno:
Dobijte prošlu sedmicu, mjesec, kvartal ili godinu u R.
Dobijte određeni broj vremenskih intervala u odnosu na datum, na primjer protekle 4 sedmice.
Lako je izdvojiti njegove komponente iz rezultirajućeg vremenskog intervala: datum početka i završetka, broj dana uključenih u interval, cijeli niz datuma koji su uključeni u njega.
Naziv svih funkcija paketa timeperiodsR su intuitivne i sastoje se iz dva dijela: smjer_intervalgdje:
smjer u kojem se trebate pomaknuti u odnosu na dati datum: zadnji_n, prethodni, ovaj, sljedeći, sljedeći_n.
vremenski interval za izračunavanje perioda: dan, sedmica, mjesec, kvartal, godina.
Kompletan set funkcija:
last_n_days()
last_n_weeks()
last_n_months()
last_n_quarters()
last_n_years()
previous_week()
previous_month()
previous_quarter()
previous_year()
this_week()
this_month()
this_quarter()
this_year()
next_week()
next_month()
next_quarter()
next_year()
next_n_days()
next_n_weeks()
next_n_months()
next_n_quarters()
next_n_years()
custom_period()
Vremenski intervali u vremenskim periodimaR
Ove funkcije su korisne u slučajevima kada trebate napraviti izvještaje na osnovu podataka iz prošle sedmice ili mjeseca. Da biste dobili posljednji mjesec, koristite istoimenu funkciju previous_month():
prmonth <- previous_month()
Nakon toga ćete imati objekat prmonth razred tpr, iz kojeg se lako mogu dobiti sljedeće komponente:
datum početka perioda, u našem primjeru ovo je posljednji mjesec
datum završetka perioda
broj dana uključenih u period
redoslijed datuma uključenih u period
Štaviše, svaku od komponenti možete nabaviti na različite načine:
# первый день периода
prmonth$start
start(prmonth)
# последний день периода
prmonth$end
end(prmonth)
# последовательность дат
prmonth$sequence
seq(prmonth)
# количество дней входящих в период
prmonth$length
length(prmonth)
Također možete dobiti bilo koju od komponenti koristeći argument dio, koji je prisutan u svakoj od funkcija paketa. Moguće vrijednosti: početak, kraj, sekvenca, dužina.
previous_month(part = "start") # начало периода
previous_month(part = "end") # конец периода
previous_month(part = "sequence") # последовательность дат
previous_month(part = "length") # количество дней в периоде
Pogledajmo sve argumente dostupne u funkcijama paketa timeperiodsR:
x — Referentni datum od kojeg će se računati vremenski period, trenutni datum po defaultu;
n — Broj intervala koji će biti uključeni u period, na primjer prethodne 3 sedmice;
part — Koja komponenta objekta tpr morate da dobijete, podrazumevano all;
week_start — Argument je prisutan samo u funkcijama za rad sa sedmicama i omogućava vam da postavite broj dana u sedmici koji će se smatrati njenim početkom. Po defaultu, početak sedmice je ponedjeljak, ali možete postaviti bilo koji od 1 - ponedeljak do 7 - nedelja.
Dakle, možete izračunati bilo koji vremenski period u odnosu na trenutni ili bilo koji drugi dati datum; evo još nekoliko primjera:
# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06",
n = 3,
week_start = 1)
Time period: from 9 September of 2019, Monday to 29 September of 2019, Sunday
6. oktobar je nedelja:
Potreban nam je period koji će u odnosu na 6. oktobar trajati prethodne 3 sedmice. Ne uključujući sedmicu koja uključuje sam 6. oktobar. Shodno tome, ovo je period od 9. septembra do 29. septembra.
# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4)
Time period: from 1 May of 2019, Wednesday to 31 May of 2019, Friday
U ovom primjeru nas zanima mjesec koji je bio prije 4 mjeseca, ako krenemo od 16. septembra 2019. godine, onda je to bio maj 2019. godine.
Filtriranje vektora datuma pomoću vremenskih periodaR
Za filtriranje datuma u timeperiodsR Postoji nekoliko operatera:
%left_out% - upoređuje dva objekta tpr klase, i vraća vrijednost s lijeve koja nedostaje u desnom.
%left_in% - upoređuje dva objekta klase tpr, i vraća datume iz lijevog objekta koji su uključeni u desni.
%right_out% - upoređuje dva objekta tpr klase i vraća vrijednost iz desne koja nedostaje lijevom.
%right_in% - upoređuje dva objekta tpr klase, i vraća datume iz desnog objekta koji su prisutni u lijevom.
period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")
period1 %left_in% period2 # получить даты из period1 которые входят в period2
period1 %left_out% period2 # получить даты из period1 которые не входят в period2
period1 %right_in% period2 # получить даты из period2 которые входят в period1
period1 %right_out% period2 # получить даты из period2 которые не входят в period1
U paketu timeperiodsR postoji jedan službeni, na ruskom jeziku YouTube plejlista.
zaključak
Detaljno smo ispitali klase objekata koji su dizajnirani u jeziku R za rad sa datumima. Također sada možete izvoditi aritmetičke operacije nad datumima i brzo dobiti bilo koje vremenske periode koristeći paket timeperiodsR.
Ako ste zainteresovani za R jezik, pozivam vas da se pretplatite na moj telegram kanal R4marketing, u kojem svakodnevno dijelim korisne materijale o korištenju R jezika u rješavanju vaših svakodnevnih problema.