ProHoster > Blog > uprava > Rad s datumima u R (osnovne mogućnosti, kao i paketi lubridate i timeperiodsR)
Rad s datumima u R (osnovne mogućnosti, kao i paketi lubridate i timeperiodsR)
Dobijte trenutni datum u bilo kojem programskom jeziku, operacija ekvivalentna "Hello world!" Jezik R nije iznimka.
U ovom ćemo članku pogledati kako rad s datumima funkcionira u osnovnoj sintaksi jezika R, a također ćemo pogledati nekoliko korisnih paketa koji proširuju njegove mogućnosti pri radu s datumima:
lubridate — paket koji vam omogućuje izvođenje aritmetičkih izračuna između datuma;
timeperiodsR — paket za rad s vremenskim intervalima i njihovim komponentama.
sadržaj
Ako vas zanima analiza podataka, a posebno jezik R, možda će vas zanimati moj telegram и youtube kanala. Većina sadržaja posvećena je jeziku R.
Basic R ima skup funkcija za rad s datumima. Nedostatak osnovne sintakse je što su imena funkcija i argumenata vrlo razbacani i praktički nemaju nikakve logičke veze. No, potrebno je poznavati osnovne funkcije jezika, pa ćemo s njima početi.
Najčešće kada učitavate podatke u R, iz csv datoteka ili drugih izvora, datum primate kao tekst. Za pretvaranje ovog teksta u ispravnu vrstu podataka upotrijebite 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() prihvaća datum u dva formata: GGGG-MM-DD ili GGGG/MM/DD.
Ako vaš skup podataka sadrži datume u nekom drugom formatu, možete upotrijebiti 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 tablici ispod:
Format
Opis
%d
Broj dana u mjesecu
%a
Skraćenica za naziv dana u tjednu
%A
Puni naziv dana u tjednu
%w
Broj dana u tjednu (0-6, gdje je 0 nedjelja)
%m
Dvoznamenkasti naziv mjeseca (01-12)
%b
Skraćenica naziva mjeseca (travanj, mart, …)
%B
Puni naziv mjeseca
%y
Dvoznamenkasta oznaka godine
%Y
Četveroznamenkasta oznaka godine
%j
Broj dana u godini (001 - 366)
%U
Broj tjedna u godini (00 - 53), početak tjedna nedjelja
%W
Broj tjedna u godini (00 - 53), početak tjedna ponedjeljak
Prema tome, "26. rujna 2019." puni je naziv mjeseca, datuma i godine. Ovaj format datuma može se opisati korištenjem operatora na sljedeći način:"%B %d, %Y".
Gdje:
%B — Puni naziv mjeseca
%d — Broj dana u mjesecu
%Y — Četveroznamenkasta oznaka godine
Kada opisujete format datuma, važno je uključiti sve dodatne znakove iz niza, kao što su crtice, zarezi, točke, razmaci i tako dalje. U mom primjeru, "26. rujna 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 sustavu. Na primjer, preuzeli ste podatke gdje je datum naveden ovako: "15. prosinca 2019." Prije pretvaranja ovog niza u datum morate promijeniti lokalizaciju.
# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")
Izdvajanje komponenti datuma u osnovnom R
Nema mnogo funkcija u osnovnom R-u koje vam omogućuju izdvajanje bilo kojeg dijela datuma iz objekta klase Datum.
current_date <- Sys.Date() # текущая дата
weekdays(current_date) # получить номер дня недели
months(current_date) # получить номер месяца в году
quarters(current_date) # получить номер квартала в году
Pored glavne klase objekata 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 osim datuma pohranjuju 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 je format po značenju sličan UNIXTIME, i pohranjuje broj sekundi od početka UNIX ere (ponoć (UTC) od 31. prosinca 1969. do 1. siječnja 1970.).
Klasa POSIXlt također pohranjuje vrijeme i datum i sve njihove komponente. Dakle, to je objekt sa složenijom strukturom, ali iz kojeg je lako dobiti bilo koju komponentu datuma i vremena jer zapravo POSIXlt ovo popis.
# Получаем текущую дату и время
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, niz ili objekt klase Datum, koji treba pretvoriti;
tz — Vremenska zona, zadano "GMT";
format — Opis formata datuma u kojem su podaci proslijeđeni argumentu x predstavljeni;
podrijetlo — Koristi se samo kod pretvaranja broja u POSIX; u ovaj argument morate proslijediti objekt datuma i vrijeme od kojeg se broje sekunde. Obično se koristi za prijevod iz UNIXTIME-a.
Ako su vaši podaci o datumu i vremenu UNIXTIME, zatim ih pretvorite u jasan, čitljiv datum, upotrijebite sljedeći primjer:
# Конвертируем UNIXTIME в читаемую дату
as.POSIXlt(1570084639, origin = "1970-01-01")
U podrijetlu možete navesti bilo koju vremensku oznaku. Na primjer, ako vaši podaci sadrže datum i vrijeme kao broj sekundi od 15. rujna 2019. u 12:15, tada ih za pretvaranje u datum upotrijebite:
# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123, origin = "2019-09-15 12:15:00")
Rad s datuljama pomoću lubridate paketa
lubridate Možda najpopularniji paket za rad s datumima u jeziku R. Omogućuje vam tri dodatna razreda.
durations — trajanje, t j . broj sekundi između dvije vremenske oznake;
razdoblja - razdoblja vam omogućuju izračune između datuma u intervalima čitljivim za čovjeka: dani, mjeseci, tjedni i tako dalje;
intervali - objekti koji daju početnu i završnu točku u vremenu.
Instalacija dodatnih paketa u jeziku R provodi se pomoću standardne funkcije install.packages().
Instalacija paketa lubridate:
install.packages("lubridate")
Pretvorite tekst u datum pomoću lubridate
Značajke paketa lubridate značajno pojednostaviti postupak pretvaranja teksta u datum, a također vam omogućiti izvođenje bilo kakvih aritmetičkih operacija 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 cijela obitelj funkcija čija se imena uvijek sastoje od tri slova, a označavaju slijed komponenti datuma:
y - godina
m - mjesec
d - dan
Popis funkcija za pretvaranje teksta u datum putem lubridate
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 vidiš lubridate Mnogo je učinkovitiji u prepoznavanju opisa datuma kao teksta i omogućuje vam pretvaranje teksta u datum bez upotrebe dodatnih operatora za opisivanje formata.
Izdvajanje komponenti datulje pomoću lubridate paketa
Također koristeći lubridate možete dobiti bilo koju komponentu od 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 raznih 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 vrijeme
round_date - zaokruživanje na najbliže vrijeme
Svaka od ovih funkcija ima argument jedinicakoji vam omogućuje da odredite jedinicu zaokruživanja: sekunda, minuta, sat, dan, tjedan, mjesec, dva mjeseca, kvartal, sezona, 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, shvatimo kako dobiti datum koji je 8 dana nakon tekućeg datuma i napravimo razne druge aritmetičke izračune između dva datuma.
today() + days(8) # какая дата будет через 8 дней
today() - months(2) # какая дата была 2 месяца назад
today() + weeks(12) # какая дата будет через 12 недель
today() - years(2) # какая дата была 2 года назад
Pojednostavljen rad s razdobljima, timeperiodsR paket.
timeperiodsR — novi paket za rad s datumima koji je objavljen na CRAN-u u rujnu 2019.
Instalacija paketa timeperiodsR:
install.packages("timeperiodsR")
Glavna svrha je brzo odrediti određeni vremenski interval u odnosu na dati datum. Na primjer, pomoću njegovih funkcija možete jednostavno:
Dobijte prošli tjedan, mjesec, kvartal ili godinu u R.
Dohvatite određeni broj vremenskih intervala u odnosu na datum, na primjer posljednja 4 tjedna.
Lako je izdvojiti njegove komponente iz dobivenog vremenskog intervala: početni i završni datum, broj dana uključenih u interval, cijeli niz datuma koji su uključeni u njega.
Naziv svih funkcija paketa timeperiodsR su intuitivni i sastoje se od dva dijela: smjer_interval, gdje:
smjer u kojem se trebate kretati u odnosu na dati datum: zadnji_n, prethodni, ovaj, sljedeći, sljedeći_n.
vremenita interval za izračunavanje razdoblja: dan, tjedan, mjesec, kvartal, godina.
Kompletan skup 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 razdobljimaR
Ove su funkcije korisne u slučajevima kada trebate izraditi izvješća na temelju podataka iz prošlog tjedna ili mjeseca. Za dobivanje zadnjeg mjeseca koristite istoimenu funkciju previous_month():
prmonth <- previous_month()
Nakon čega ćete imati objekt prmjesec razred TPR, iz koje se lako mogu dobiti sljedeće komponente:
datum početka razdoblja, u našem primjeru to je zadnji mjesec
datum završetka razdoblja
broj dana uključenih u razdoblje
slijed datuma uključenih u razdoblje
Štoviše, svaku od komponenti možete dobiti 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 pomoću argumenta dio, koji je prisutan u svakoj od funkcija paketa. Moguće vrijednosti: početak, kraj, niz, duljina.
previous_month(part = "start") # начало периода
previous_month(part = "end") # конец периода
previous_month(part = "sequence") # последовательность дат
previous_month(part = "length") # количество дней в периоде
Dakle, pogledajmo sve argumente dostupne u funkcijama paketa timeperiodsR:
x — Referentni datum od kojeg će se računati vremensko razdoblje, prema zadanim postavkama trenutni datum;
n — Broj intervala koji će biti uključeni u razdoblje, na primjer prethodna 3 tjedna;
part — Koja komponenta predmeta tpr morate dobiti, prema zadanim postavkama all;
week_start — Argument je prisutan samo u funkcijama za rad s tjednima i omogućuje vam da postavite broj dana u tjednu koji će se smatrati njegovim početkom. Prema zadanim postavkama, početak tjedna je ponedjeljak, ali možete postaviti bilo koji od 1 - ponedjeljak do 7 - nedjelja.
Dakle, možete izračunati bilo koje vremensko razdoblje 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. listopada je nedjelja:
Treba nam razdoblje koje će, u odnosu na 6. listopada, trajati prethodna 3 tjedna. Ne uključujući tjedan koji uključuje sam 6. listopada. Sukladno tome, radi se o razdoblju od 9. rujna do 29. rujna.
# получить месяц отстающий на 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. rujna 2019., tada je to bio svibanj 2019.
Filtriranje vektora datuma pomoću vremenskih razdobljaR
Za filtriranje datuma u timeperiodsR Postoji nekoliko operatera:
%left_out% - uspoređuje dva objekta klase tpr i vraća vrijednost s lijeve koja nedostaje u desnom.
%left_in% - uspoređuje dva objekta klase tpr i vraća datume iz lijevog objekta koji su uključeni u desni.
%right_out% - uspoređuje dva objekta klase tpr i vraća vrijednost s desnog koja nedostaje s lijevog.
%right_in% - uspoređuje dva objekta klase tpr 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
Detaljno smo ispitali klase objekata koji su dizajnirani u jeziku R za rad s datumima. Također sada možete izvoditi aritmetičke operacije na datumima i brzo dobiti bilo koje vremensko razdoblje pomoću paketa timeperiodsR.
Ako ste zainteresirani 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.