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.

Sisu
Kui sind huvitab andmeanalüüs, eelkõige R keel, võivad sind huvitada minu ja kanalid. Suur osa sisust on pühendatud R keelele.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
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 aastasLisaks 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 kellaaegStringi 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äevAritmeetilised 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 ajaniceiling_date— ümardamine lähima tuleviku ajaniround_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 poolaastaleNii 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 tagasiLihtsustatud 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 perioodisNii 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 objektisttprteil on vajalik saada, vaikimisiall;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äev6. oktoober on pühapäev:

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.

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4) Ajaperiood: 1. mai 2019, kolmapäev kuni 31. mai 2019, reedeSelles 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-ssePakett timeperiodsR omab ametlikku, venekeelset .
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 , kus jagan igapäevaselt kasulikke materjale R keele rakendamisest oma igapäevastes ülesannetes.
Allikas: habr.com
