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.

Rad s datumima u R (osnovne mogućnosti, kao i paketi lubridate i timeperiodsR)

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.

  1. Rad s datumima u osnovnoj R sintaksi
    1.1. Pretvori tekst u datum
    1.2. Izdvajanje komponenti datuma u osnovnom R
  2. Rad s datuljama pomoću lubridate paketa
    2.1. Pretvorite tekst u datum pomoću lubridate
    2.2. Izdvajanje komponenti datulje pomoću lubridate paketa
    2.3. Aritmetičke operacije s datumima
  3. Pojednostavljen rad s razdobljima, timeperiodsR paket
    3.1. Vremenski intervali u vremenskim razdobljimaR
    3.2. Filtriranje vektora datuma pomoću vremenskih razdobljaR
  4. Zaključak

Rad s datumima u osnovnoj R sintaksi

Pretvori tekst u datum

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:
Rad s datumima u R (osnovne mogućnosti, kao i paketi lubridate i timeperiodsR)

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.

Rad s datumima u R (osnovne mogućnosti, kao i paketi lubridate i timeperiodsR)

# получить месяц отстающий на 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

Na paketu timeperiodsR postoji službeni, na ruskom jeziku YouTube popis za reprodukciju.

Zaključak

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.

Izvor: www.habr.com

Dodajte komentar