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.

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

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.

  1. Rad sa datumima u osnovnoj R sintaksi
    1.1. Pretvorite tekst u datum
    1.2. Ekstrahiranje komponenti datuma u osnovnom R
  2. Rad sa hurmama koristeći lubridate paket
    2.1. Pretvorite tekst u datum koristeći lubridate
    2.2. Ekstrahiranje komponenti datuma pomoću paketa za podmazivanje
    2.3. Aritmetičke operacije s datumima
  3. Pojednostavljen rad sa periodima, vremenskim periodimaR paketom
    3.1. Vremenski intervali u vremenskim periodimaR
    3.2. Filtriranje vektora datuma pomoću vremenskih periodaR
  4. zaključak

Rad sa datumima u osnovnoj R sintaksi

Pretvorite tekst u datum

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

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.

Rad sa 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. 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.

izvor: www.habr.com

Dodajte komentar