Kuupäevadega töötamine R-s (põhivõimalused, samuti määrdeaine ja ajaperioodide R paketid)

Hankige praegune kuupäev mis tahes programmeerimiskeeles, mis on samaväärne funktsiooniga "Tere maailm!" R-keel pole erand.

Selles artiklis vaatleme, kuidas töötab kuupäevadega töötamine R-keele põhisüntaksis, ja vaatame ka mitmeid kasulikke pakette, mis laiendavad selle võimalusi kuupäevadega töötamisel:

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

Kuupäevadega töötamine R-s (põhivõimalused, samuti määrdeaine ja ajaperioodide R paketid)

Sisu

Kui olete huvitatud andmete analüüsist ja eriti R-keelest, võite olla huvitatud minust telegramm и youtube kanalid. Suurem osa sisust on pühendatud R-keelele.

  1. Kuupäevadega töötamine põhisüntaksis R
    1.1. Teisenda tekst kuupäevaks
    1.2. Kuupäeva komponentide ekstraheerimine põhilises R-is
  2. Kuupäevadega töötamine määrdeainepaketi abil
    2.1. Teisendage tekst kuupäevaks libeda abil
    2.2. Kuupäevakomponentide ekstraheerimine määrdepaketi abil
    2.3. Aritmeetilised tehted kuupäevadega
  3. Lihtsustatud töö perioodidega, timeperiodsR pakett
    3.1. Ajavahemikud ajavahemikesR
    3.2. Kuupäevade vektori filtreerimine ajaperioodideR abil
  4. Järeldus

Kuupäevadega töötamine põhisüntaksis R

Teisenda tekst kuupäevaks

Basic R-l on funktsioonide komplekt kuupäevadega töötamiseks. Põhisüntaksi miinuseks on see, et funktsioonide nimede ja argumentide juhtum on väga hajutatud ning praktiliselt puudub loogiline seos. Siiski peate teadma keele põhifunktsioone, seega alustame neist.

Enamasti saate andmeid R-i, csv-failidest või muudest allikatest laadides tekstina kuupäeva. Selle teksti õigeks andmetüübiks teisendamiseks 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() aktsepteerib kuupäeva kahes vormingus: AAAA-KK-PP või AAAA/KK/PP.
Kui teie andmekogum sisaldab kuupäevi mõnes muus vormingus, võite kasutada argumenti format.

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

formaat aktsepteerib stringikujulisi operaatoreid, mis tähistavad mis tahes ajavahemikku ja selle vormingut; kõige sagedamini kasutatavad väärtused on näidatud allolevas tabelis:

Formaat
Kirjeldus

%d
Päeva number kuus

%a
Nädalapäeva nimetuse lühend

%A
Nädalapäeva täisnimi

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

%m
Kahekohaline kuu tähistus (01-12)

%b
Kuu nime lühend (apr, märts, …)

%B
Kuu täisnimi

%y
Kahekohaline aasta tähistus

%Y
Neljakohaline aasta tähistus

%j
Päeva number aastal (001 - 366)

%U
Nädala arv aastas (00 - 53), nädala algus pühapäev

%W
Nädala number aastal (00 - 53), nädala algus esmaspäev

Seetõttu on “26. september 2019” kuu, kuupäeva ja aasta täisnimi. Seda kuupäevavormingut saab operaatorite abil kirjeldada järgmiselt:"%B %d, %Y".

Kui:

  • %B — Kuu täisnimi
  • %d — päeva number kuus
  • %Y — Neljakohaline aastatähis

Kuupäevavormingu kirjeldamisel on oluline lisada stringi kõik täiendavad märgid, nagu sidekriipsud, komad, punktid, tühikud jne. Minu näites “26. september 2019” on kuupäeva järel koma ja vormingu kirjeldusse tuleb ka koma panna:"%B %d, %Y".

On olukordi, kus saate kuupäeva, mis mitte ainult ei vasta standardvormingutele (AAAA-KK-PP või AAAA/KK/PP), aga ka keeles, mis erineb teie operatsioonisüsteemi installitud vaikekeelest. Näiteks laadisite alla andmed, mille kuupäev on märgitud järgmiselt: „15. detsember 2019”. Enne selle stringi kuupäevaks teisendamist peate muutma lokaadi.

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

Kuupäeva komponentide ekstraheerimine põhilises R-is

Põhilises R-is pole palju funktsioone, mis võimaldavad teil klassiobjektist välja võtta mis tahes osa kuupäevast kuupäev.

current_date <- Sys.Date() # текущая дата
weekdays(current_date)     # получить номер дня недели
months(current_date)       # получить номер месяца в году
quarters(current_date)     # получить номер квартала в году

Lisaks põhiobjektiklassile kuupäev Põhilises R-s on veel 2 andmetüüpi, mis salvestavad ajatempli: POSIXlt, POSIXct. Peamine erinevus nende klasside ja kuupäev on see, et nad salvestavad lisaks kuupäevale ka kellaaja.

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

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

# "POSIXct" "POSIXt"

Funktsioon Sys.time() tagastab praeguse kuupäeva ja kellaaja vormingus POSIXct. See formaat on tähenduselt sarnane UNIXTIMEja salvestab UNIX-i ajastu algusest möödunud sekundite arvu (kesköö (UTC) 31. detsembrist 1969 kuni 1. jaanuarini 1970).

Klass POSIXlt see salvestab ka kellaaja ja kuupäeva ning kõik nende komponendid. Seetõttu on tegemist keerukama struktuuriga objektiga, millelt on aga lihtne hankida mis tahes kuupäeva ja kellaaja komponenti, sest tegelikult POSIXlt это nimekiri.

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

Numbri- ja tekstiandmete teisendamine vormingutesse POSIX* mida teostavad funktsioonid as.POSIXct() и as.POSIXlt(). Nendel funktsioonidel on väike arv argumente.

  • x — arv, string või klassi objekt kuupäev, mis tuleb teisendada;
  • tz — ajavöönd, vaikimisi "GMT";
  • format — kuupäevavormingu kirjeldus, milles x-argumendile edastatud andmed esitatakse;
  • päritolu — kasutatakse ainult numbri teisendamiseks POSIX-iks; peate selle argumendi jaoks edastama kuupäevaobjekti ja kellaaja, millest alates loetakse sekundid. Tavaliselt kasutatakse tõlkimiseks UNIXTIME-st.

Kui teie kuupäeva ja kellaaja teave on sisestatud UNIXTIME, siis kasutage nende selgeks ja loetavaks kuupäevaks teisendamiseks järgmist näidet.

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

Algses saate määrata mis tahes ajatempli. Näiteks kui teie andmed sisaldavad kuupäeva ja kellaaega sekundite arvuna alates 15. septembrist 2019 kell 12:15, siis kasutage nende kuupäevaks teisendamiseks järgmist.

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

Kuupäevadega töötamine määrdeainepaketi abil

lubridate Võib-olla kõige populaarsem pakett R-keeles kuupäevadega töötamiseks. See pakub teile kolme lisaklassi.

  • kestused — kestus, s.o. sekundite arv kahe ajatempli vahel;
  • perioodid – perioodid võimaldavad teha arvutusi kuupäevade vahel inimesele loetavate intervallidega: päevad, kuud, nädalad jne;
  • intervallid - objektid, mis pakuvad aja algus- ja lõpp-punkti.

Täiendavate pakettide installimine R-keeles toimub standardfunktsiooni abil install.packages().

Paketi paigaldamine lubridate:

install.packages("lubridate")

Teisendage tekst kuupäevaks libeda abil

Paketi omadused lubridate lihtsustab oluliselt teksti kuupäevaks teisendamist ning võimaldab teil teha ka mis tahes aritmeetilisi toiminguid kuupäevade ja kellaaegadega.

Funktsioonid aitavad teil saada praeguse kuupäeva või kuupäeva ja kellaaja today() и now().

today() # текущая дата
now()   # текущая дата и время

Stringi teisendamiseks kuupäevaks lubridate On terve hulk funktsioone, mille nimed koosnevad alati kolmest tähest ja näitavad kuupäevakomponentide järjestust:

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

Funktsioonide loend teksti kuupäevaks teisendamiseks libeda abil

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

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

ymd("2017 jan 21")
mdy("March 20th, 2019")
dmy("1st april of 2018")

Nagu sa näed lubridate See on kuupäevakirjelduste tekstina tuvastamisel palju tõhusam ja võimaldab teil teisendada teksti kuupäevaks ilma vormingu kirjeldamiseks täiendavaid operaatoreid kasutamata.

Kuupäevakomponentide ekstraheerimine määrdepaketi abil

Samuti kasutades lubridate kuupäevast saate hankida mis tahes komponendi:

dt <- ymd("2017 jan 21")

year(dt)  # год
month(dt) # месяц
mday(dt)  # день в месяце
yday(dt)  # день в году
wday(dt)  # день недели

Aritmeetilised tehted kuupäevadega

Kuid kõige olulisem ja põhifunktsioon lubridate on oskus sooritada erinevaid aritmeetilisi tehteid kuupäevadega.

Kuupäeva ümardamist teostavad kolm funktsiooni:

  • floor_date — ümardamine lähimasse minevikuvormi
  • ceiling_date — ümardamine lähitulevikusse
  • round_date - ümardamine lähima ajani

Igal neist funktsioonidest on argument üksusmis võimaldab määrata ümardusühiku: sekund, minut, tund, päev, nädal, kuu, kaks kuud, kvartal, hooaeg, poolaasta, aasta

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") # округлить до полугодия

Nii et mõtleme välja, kuidas saada kuupäev, mis on praegusest kuupäevast 8 päeva hiljem, ja teha nende kahe kuupäeva vahel mitmesuguseid muid aritmeetilisi arvutusi.

today() + days(8)   # какая дата будет через 8 дней
today() - months(2) # какая дата была 2 месяца назад
today() + weeks(12) # какая дата будет через 12 недель
today() - years(2)  # какая дата была 2 года назад

Lihtsustatud töö perioodidega, timeperiodsR pakett.

timeperiodsR — värske pakett kuupäevadega töötamiseks, mis avaldati CRANis 2019. aasta septembris.

Paketi paigaldamine timeperiodsR:

install.packages("timeperiodsR")

Peamine eesmärk on kiiresti kindlaks määrata teatud ajavahemik antud kuupäeva suhtes. Näiteks saate selle funktsioone kasutades hõlpsalt:

  • Vaadake möödunud nädala, kuu, kvartali või aasta R-s.
  • Hankige teatud ajavahemike arv kuupäeva suhtes, näiteks viimased 4 nädalat.
  • Saadud ajavahemikust on lihtne eraldada selle komponente: algus- ja lõppkuupäev, intervalliga hõlmatud päevade arv, kogu selles sisalduvate kuupäevade jada.

Kõigi paketifunktsioonide nimed timeperiodsR on intuitiivsed ja koosnevad kahest osast: suund_intervallkus:

  • suund milles peate liikuma antud kuupäeva suhtes: viimane_n, eelmine, see, järgmine, järgmine_n.
  • ajaline intervall 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()

Ajavahemikud ajavahemikesR

Need funktsioonid on kasulikud juhtudel, kui peate koostama aruandeid eelmise nädala või kuu andmete põhjal. Viimase kuu vaatamiseks kasutage samanimelist funktsiooni previous_month():

prmonth <- previous_month()

Pärast seda on teil objekt prmonth klass tpr, millest saab hõlpsasti hankida järgmisi komponente:

  • perioodi alguskuupäev, meie näites on see viimane kuu
  • perioodi lõppkuupäev
  • perioodi hõlmatud päevade arv
  • perioodi hõlmatud kuupäevade jada

Lisaks saate iga komponenti hankida erineval viisil:

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

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

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

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

Samuti saate argumendi abil hankida mis tahes komponendi osa, mis on olemas igas paketifunktsioonis. Võimalikud väärtused: algus, lõpp, järjestus, pikkus.

previous_month(part = "start")    # начало периода
previous_month(part = "end")      # конец периода
previous_month(part = "sequence") # последовательность дат
previous_month(part = "length")   # количество дней в периоде

Nii et vaatame kõiki paketifunktsioonides saadaolevaid argumente timeperiodsR:

  • x — võrdluskuupäev, millest alates ajavahemikku arvutatakse, vaikimisi praegune kuupäev;
  • n — ajavahemikku kaasatavate intervallide arv, näiteks viimased 3 nädalat;
  • part — milline objekti komponent tpr peate vaikimisi hankima all;
  • week_start — Argument esineb ainult nädalatega töötamise funktsioonides ja võimaldab määrata selle alguseks loetava nädalapäeva numbri. Vaikimisi on nädala algus esmaspäev, kuid saate määrata mis tahes alates 1 – esmaspäevast 7 – pühapäevani.

Seega saate arvutada mis tahes ajaperioodi praeguse või mõne muu etteantud kuupäeva suhtes; siin on veel mõned näited:

# получить 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. oktoober on pühapäev:
Kuupäevadega töötamine R-s (põhivõimalused, samuti määrdeaine ja ajaperioodide R paketid)

Vajame perioodi, mis 6. oktoobriga võrreldes võtab viimased 3 nädalat. Välja arvatud nädal, mis hõlmab 6. oktoobrit ennast. Vastavalt sellele on see periood 9. septembrist 29. septembrini.

Kuupäevadega töötamine R-s (põhivõimalused, samuti määrdeaine ja ajaperioodide R paketid)

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

Selles näites huvitab meid kuu, mis oli 4 kuud tagasi, kui alustame 16. septembrist 2019, siis oli see 2019. aasta mai.

Kuupäevade vektori filtreerimine ajaperioodideR abil

Kuupäevade filtreerimiseks timeperiodsR Operaatoreid on mitu:

  • %left_out% – võrdleb kahte tpr-klassi objekti ja tagastab vasakpoolse väärtuse, mis paremas puudub.
  • %left_in% – võrdleb kahte tpr-klassi objekti ja tagastab vasakpoolsest objektist pärit kuupäevad, mis sisalduvad paremas objektis.
  • %right_out% – võrdleb kahte tpr-klassi objekti ja tagastab parempoolse väärtuse, mis vasakpoolsest puudub.
  • %right_in% – võrdleb kahte tpr-klassi objekti ja tagastab parempoolse objekti kuupäevad, mis on vasakpoolses objektis.

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

Paki juures timeperiodsR on ametlik, venekeelne YouTube'i esitusloend.

Järeldus

Uurisime üksikasjalikult objektide klasse, mis on kujundatud R-keeles kuupäevadega töötamiseks. Samuti saate nüüd teha aritmeetilisi tehteid kuupäevadega ja hankida paketi abil kiiresti mis tahes ajaperioode timeperiodsR.

Kui olete huvitatud R-keelest, kutsun teid tellima minu telegrammi kanalit R4 turundus, milles jagan igapäevaselt kasulikke materjale R-keele kasutamisest oma igapäevaste probleemide lahendamisel.

Allikas: www.habr.com

Lisa kommentaar