Kuupäevade käsitlemine R keeles (põhifunktsioonid ning paketid lubridate ja timeperiodsR)

Saada käesolev kuupäev igas programmeerimiskeeles, toiming on analoogne "Tere maailm!". R keel ei ole erand.

Selles artiklis uurime, kuidas kuupäevadega töötamine toimub R keeles põhisüntaksis, samuti vaatame üle mõned kasulikud paketid, mis laiendavad selle võimeid kuupäevade käsitlemisel:

  • lubridate — paket, mis võimaldab teha arvutusi kuupäevade vahel;
  • timeperiodsR — paket ajaintervallide ja nende komponentidega töötamiseks.

Kuupäevade käsitlemine R keeles (põhifunktsioonid ning paketid lubridate ja timeperiodsR)

Sisu

Kui sind huvitab andmeanalüüs, eelkõige R keel, võivad sind huvitada minu telegram ja youtube kanalid. Suur osa sisust on pühendatud R keelele.

  1. Kuupäevade töötlemine R põhisüntaksis
    1.1. Teksti muutmine kuupäevaks
    1.2. Kuupäevakomponentide ekstraheerimine R põhisüntaksis
  2. Kuupäevade töötlemine lubridate paketi abil
    2.1. Teksti muutmine kuupäevaks lubridate abil
    2.2. Kuupäevakomponentide ekstraheerimine lubridate paketiga
    2.3. Aritmeetilised tehteid kuupäevadega
  3. Lihtsustatud töö perioodidega, pakett timeperiodsR
    3.1. Ajaintervallid timeperiodsR-s
    3.2. Kuupäevade vektori filtreerimine timeperiodsR abil
  4. Kokkuvõte

Kuupäevade töötlemine R põhisüntaksis

Teksti muutmine kuupäevaks

R-i põhiversioonis on funktsioonide kogum kuupäevadega töötamiseks. Põhisinvestis on aga see, et funktsioonide nimede ja argumentide puhul on registreerimine väga ebajärjekindel ning praktiliselt pole mingit loogilist seost. Sellegipoolest tuleb teada keele põhifunktsioone, seega alustame just nendega.

Andmete laadimisel R-i, kas csv failidest või teistest allikatest, saate kuupäevi sageli tekstina. Selleks, et tuua see tekst õigesse andmetüüpi, kasutage funktsiooni 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"

Vaikimisi as.Date() mis aktsepteerib kuupäevi kahes formaadis: AAAA-KK-PÄEV või AAAA/KK/PÄEV.
Kui teie andmekogus esitatakse kuupäevad mingis muus formaadis, saab konverteerimiseks kasutada argumenti format.

as.Date("September 26, 2019", format = "%B %d, %Y")

format võtab stringina vastu operaatorid, mis tähistavad mõnda ajavahemikku ja selle formaati; kõige sagedamini kasutatavad väärtused on toodud tabelis allpool:

Formaat
Kirjeldus

%d
Kuu päeva number

%a
Nädala päeva nime lühend

%A
Nädala päeva täisnimetus

%w
Nädala päeva number (0-6, kus 0 on pühapäev)

%m
Kaks numbrit kuude tähistamiseks (01-12)

%b
Kuu nime lühend (apr, mar, …)

%B
Kuu täisnimetus

%y
Kahekohaline aasta tähis

%Y
Neljakohaline aasta tähis

%j
Aasta päevade number (001 — 366)

%U
Nädala number aastas (00 — 53), nädal algab pühapäeval

%W
Nädala number aastas (00 — 53), nädal algab esmaspäeval

Seega on "26. september 2019" – kuu, päeva ja aasta täisnimetus. Selle kuupäeva formaati saab kirjeldada operaatoritega järgmiselt:"%B %d, %Y".

Kus:

  • %B — Kuu täisnimi
  • %d — Päeva number kuul
  • %Y — Neljakohaline aasta tähis

Kuupäeva formaadi kirjeldamisel on oluline lisada kõik täiendavad sümbolid teie stringist, nagu sidekriipsud, komad, punktid, tühikud jne. Näiteks minu näites, "26. september 2019", kuupäeva järel on koma, ja ka formaadi kirjeldusse tuleb panna koma:"%B %d, %Y".

On olukordi, kus saate kuupäeva, mis ei vasta standardsetele formaatidele (AAAA-KK-PÄEV või AAAA/KK/PÄEV), vaid ka keeles, mis erineb teie operatsioonisüsteemis seadistatud vaikekeeletest. Näiteks olete laadinud andmed, kus kuupäev on esitatud järgmisel kujul: "15. detsember 2019". Enne selle stringi kuupäevaks konverteerimist peate vahetama lokaali.

# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")

Kuupäevakomponentide ekstraheerimine R põhisüntaksis

Põhiversioonis R-is pole palju funktsioone, mis võimaldaksid kuupäevast objekti osa välja tõmmata. Date.

current_date <- Sys.Date() # tänane kuupäev
weekdays(current_date)     # nädalapäeva number
months(current_date)       # kuu number aastas
quarters(current_date)     # kvartali number aastas

Lisaks peamisele objekti klassile Date põhiversioonis R-is on veel 2 andmetüüpi, mis salvestavad ajamärke: POSIXlt, POSIXct. Nende klasside peamine erinevus Date on see, et lisaks kuupäevale salvestavad nad ka aega.

# получить текущую дату и время
current_time <- Sys.time()

# узнать класс объекта current_time 
class(current_time)

# "POSIXct" "POSIXt"

Function Sys.time() tagastab praeguse kuupäeva ja kellaaja formaadis POSIXct. See vorm on mõttelt sarnane UNIXTIME, ja sisaldab arvu sekundeid alates UNIXi ajastu algusest (ööl (UTC) 31. detsembrist 1969 kuni 1. jaanuarini 1970).

Klass POSIXlt samuti salvestab aega ja kuupäeva, ning nende kõiki komponente. Seetõttu on see objekti keerukama struktuuriga, kuid millest on lihtne saada mistahes kuupäeva ja kellaaja komponent, kuna põhiolemuselt POSIXlt see loend.

# Получаем текущую дату и время
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  # часовой пояс

Numbriliste ja tekstiliste andmete teisendamine formaatidesse POSIX* teostatakse funktsioonide abil as.POSIXct() ja as.POSIXlt(). Need funktsioonid omavad väikest argumentide kogumit.

  • x — number, string või objekti klass Date, mille tuleb teisendada;
  • tz — ajavöönd, vaikimisi "GMT";
  • forma — Kuupäeva vormaat, milles andmed, mis edastatakse argumendile x, on esitatud;
  • originaal — Kasutatakse ainult arvu konverteerimisel POSIX-ks, sellele argumendile tuleb edastada kuupäeva ja kellaaja objekt, mille järgi sekundite arvestus algab. Tüüpiliselt kasutatakse UNIXTIME-st konverteerimiseks.

Kui teie kuupäeva ja kellaaja andmed on esitatud UNIXTIME, siis nende konverteerimiseks arusaadavaks, loetavaks kuupäevaks kasutage järgmist näidet:

# Конвертируем UNIXTIME в читаемую дату 
as.POSIXlt(1570084639,  origin = "1970-01-01")

Originaalis saate määrata ükskõik millise ajatempli. Näiteks, kui teie andmetes on kuupäev ja aeg näidatud sekundite arvuna alates 15. septembrist 2019 kell 12:15, siis nende kuupäevaks teisendamiseks kasutage:

# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123,  origin = "2019-09-15 12:15:00")

Kuupäevade töötlemine lubridate paketi abil

lubridate ilmselt kõige populaarsem pakett kuupäevadega töötamiseks R keeles. See pakub teile veel kolm klassi.

  • kestused — kestvus, st sekundite arv kahe ajatempli vahel;
  • perioodid — perioodid võimaldavad teostada arvutusi kuupäevade vahel inimsõbralike ajavahemikega: päevade, kuude, nädalate ja niimoodi edasi;
  • intervallid — objektid, mis pakuvad algus- ja lõpphetke.

Lisapakettide installimine R keeles toimub standardse funktsiooni install.packages() kaudu..

Paki installimine lubridate:

install.packages("lubridate")

Teksti muutmine kuupäevaks lubridate abil

Paki funktsioonid lubridate muudavad teksti kuupäevaks konverteerimise protsessi oluliselt lihtsamaks ning võimaldavad teil teha kuupäevade ja aja kohta igasuguseid aritmeetilisi toiminguid.

Praeguse kuupäeva või kuupäeva ja kellaaja saamiseks aitavad funktsioonid today() ja now().

today() # praegune kuupäev
now()   # praegune kuupäev ja kellaaeg

Stringi kuupäevaks muutmiseks on lubridate täielik funktsioonide perekond, mille nimed koosnevad alati kolmest tähest ja tähistavad kuupäeva komponente:

  • y — aasta
  • m — kuu
  • d — päev

Funktsioonide loetelu teksti kuupäevaks konverteerimiseks lubridate kaudu

  • ymd()
  • ydm()
  • mdy()
  • myd()
  • dmy()
  • dym()
  • yq()

Mõned näited stringide kuupäevadeks muutmisest:

ymd("2017 jaan 21")
mdy("20. märts 2019")
dmy("1. aprill 2018")

Nagu näete, lubridate suudab see oluliselt paremini tuvastada kuupäevade tekstikirjeldusi ja võimaldab teil teksti kuupäevaks muuta, kasutamata täiendavaid operaatorite tükke formaadi kirjeldamiseks.

Kuupäevakomponentide ekstraheerimine lubridate paketiga

Samuti on lubridate võimalik saada igasugune komponent kuupäevast:

dt <- ymd("2017 jaan 21")

aasta(dt)  # aasta
kuu(dt) # kuu
päev(dt)  # päev kuus
päev aastas(dt)  # päev aastas
nädala päev(dt)  # nädalapäev

Aritmeetilised tehteid kuupäevadega

Kuid kõige olulisem ja peamine funktsionaalsus lubridate koosneb erinevate aritmeetiliste operatsioonide tegemise võimaluses kuupäevadega.

Kuupäeva ümardamine toimub kolme funktsiooni abil:

  • floor_date — ümardamine lähima möödunud ajani
  • ceiling_date — ümardamine lähima tuleviku ajani
  • round_date — ümardamine lähima ajani

Igal neist funktsioonidest on argument unit, mis võimaldab teil näidata ümardamise ühikut: second, minute, hour, day, week, month, bimonth, quarter, season, halfyear, year

dt <- ymd("2017 jaan 21")

round_date(dt, unit = "month")    # ümardada kuule
round_date(dt, unit = "3 month")  # ümardada 3 kuule
round_date(dt, unit = "quarter")  # ümardada kvartalile
round_date(dt, unit = "season")   # ümardada hooajale
round_date(dt, unit = "halfyear") # ümardada poolaastale

Nii et uurime, kuidas saada kuupäev, mis on 8 päeva pärast praegust kuupäeva ja teha erinevaid muid aritmeetilisi arvutusi kahe kuupäeva vahel.

today() + days(8)   # mis kuupäev on 8 päeva pärast
today() - months(2) # mis kuupäev oli 2 kuud tagasi
today() + weeks(12) # mis kuupäev on 12 nädala pärast
today() - years(2)  # mis kuupäev oli 2 aastat tagasi

Lihtsustatud tööperioodide haldamine, pakett timeperiodsR.

timeperiodsR — värske kuupäevade töötlemise paket, mis avaldati CRAN-is 2019. aasta septembris.

Paki installimine timeperiodsR:

install.packages("timeperiodsR")

Põhieesmärk — kiiresti määrata mingi ajavahemik antud kuupäeva suhtes. Näiteks saate selle funktsioonide abil kergesti:

  • Saada eelmine nädal, kuu, kvartal või aasta R-is.
  • Saada määratud arvu ajavahemikke antud kuupäeva suhtes, näiteks eelnevad 4 nädalat.
  • Lihtsalt ekstraktida saadud ajavahemikust selle komponente: algus- ja lõpukuupäev, päevade arv, mis jääb ajavahemikku, ning kogu kuupäevade järjestus, mis sinna kuulub.

Kõik paketi funktsioonide nimed timeperiodsR on intuitiivselt arusaadavad ja koosnevad kahest osast: suund_ajavahemik, kus:

  • suund mida tuleb liikuda antud kuupäeva suhtes: last_n, previous, this, next, next_n.
  • ajavahemik ajavahemik perioodi arvutamiseks: päev, nädal, kuu, kvartal, aasta.

Täielik funktsioonide komplekt:

  • 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()

Ajaintervallid timeperiodsR-s

Need saavutavad funktsioonid olukordades, kus on vajalik koostada aruandeid varasema nädala või kuu andmete põhjal. Varasema kuu saamiseks kasutage vastavat funktsiooni. previous_month():

prmonth <- previous_month()

Seejärel on teil objekt prmonth klass tpr, millest on lihtne saada järgmised komponendid:

  • perioodi alguskuupäev, meie näites on see eelmine kuu
  • perioodi lõppkuupäev
  • perioodi kuuluvate päevade arv
  • perioodi kuuluva kuupäevade järjestus

Iga komponente on võimalik saada erinevate viisidega:

# первый день периода
prmonth$start
start(prmonth)

# последний день периода
prmonth$end
end(prmonth)

# последовательность дат
prmonth$sequence
seq(prmonth)

# количество дней входящих в период
prmonth$length
length(prmonth)

Samuti saate igasuguseid komponente, kasutades argumenti part, mis on olemas igas paketi funktsioonis. Võimalikud väärtused: start, end, sequence, length.

previous_month(part = "start")    # perioodi algus
previous_month(part = "end")      # perioodi lõpp
previous_month(part = "sequence") # kuupäevade järjestus
previous_month(part = "length")   # päevade arv perioodis

Nii vaatame üle kõik argumendid, mis on saadaval paketi funktsioonides timeperiodsR:

  • x — Tugi kuupäev, mille alusel arvutatakse ajavahemik, vaikimisi on see praegune kuupäev;
  • n — Intervallide arv, mis kuuluvad perioodi, näiteks 3 eelnevat nädalat;
  • part — Milline komponent objektist tpr teil on vajalik saada, vaikimisi all;
  • nädala_algus — Argument on olemas ainult nädalatega töötavate funktsioonide puhul ja võimaldab määrata nädala päeva numbri, mis loetakse selle alguseks. Vaikimisi on nädala algus esmaspäev, kuid saate määrata igasuguse numbri 1 — esmaspäev kuni 7 — pühapäev.

Nii et saate arvutada mis tahes ajavahemiku suhtes praeguse või mistahes muu määratud kuupäeva, toome veel mõned näited:

# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06", 
             n = 3, 
             week_start = 1)

 Ajaperiood: 9. september 2019, esmaspäev kuni 29. september 2019, pühapäev

6. oktoober on pühapäev:
Kuupäevade käsitlemine R keeles (põhifunktsioonid ning paketid lubridate ja timeperiodsR)

Me vajame perioodi, mis võtab arvesse 6. oktoobrist kolme eelneva nädala, mitte sealhulgas nädalat, kuhu kuulub 6. oktoober. Seega on see periood 9. kuni 29. september.

Kuupäevade käsitlemine R keeles (põhifunktsioonid ning paketid lubridate ja timeperiodsR)

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4)

 Ajaperiood: 1. mai 2019, kolmapäev kuni 31. mai 2019, reede

Selles näites huvitab meid kuu, mis oli 4 kuud tagasi, kui lähtuda 16. september 2019. aastast, seega oli see mai 2019.

Kuupäevade vektori filtreerimine timeperiodsR abil

Kuupäevade filtreerimiseks timeperiodsR on mitu operaatorit:

  • %left_out% — võrdleb kahte tpr klassi objekti ja tagastab vasakult väärtuse, mis puudub paremal.
  • %left_in% — võrdleb kahte tpr klassi objekti ning tagastab vasakpoolse objekti kuupäevad, mis kuuluvad parempoolsesse.
  • %right_out% — võrdleb kahte tpr klassi objekti ning tagastab parempoolsest objektilt väärtusi, mis puuduvad vasakpoolses.
  • %right_in% — võrdleb kahte tpr klassi objekti ning tagastab parempoolsest objekti kuupäevad, mis esinevad vasakpoolses.

period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")

period1 %left_in% period2   # saada period1-st kuupäevad, mis kuuluvad period2-sse
period1 %left_out% period2  # saada period1-st kuupäevad, mis ei kuulu period2-sse
period1 %right_in% period2  # saada period2-st kuupäevad, mis kuuluvad period1-sse
period1 %right_out% period2 # saada period2-st kuupäevad, mis ei kuulu period1-sse

Pakett timeperiodsR omab ametlikku, venekeelset YouTube'i esitusloendit.

Kokkuvõte

Olemegi põhjalikult vaatlenud R keeles kuupäevadega töötamiseks mõeldud objektide klasse. Samuti oskate nüüd kuupäevadega teha aritmeetilisi toiminguid ning kiiresti saada igasuguseid ajavahemikke paketi abil. timeperiodsR.

Kui teid huvitab R keel, kutsun teid liituma minu Telegrami kanaliga R4marketing, kus jagan igapäevaselt kasulikke materjale R keele rakendamisest oma igapäevastes ülesannetes.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster