Lucrul cu datele în limbajul R (funcționalități de bază, precum și pachetele lubridate și timeperiodsR)

Obțineți data curentă în orice limbaj de programare, operație echivalentă cu "Hello world!". Limbajul R nu este o excepție.

În acest articol vom analiza cum funcționează lucrul cu datele în sintaxa de bază a limbajului R și vom explora câteva pachete utile care extind capacitățile acestuia la lucru cu date:

  • lubridate — pachet care permite realizarea de calcule aritmetice între date;
  • timeperiodsR — pachet pentru a lucra cu intervale de timp și componentele lor.

Lucrul cu datele în limbajul R (funcționalități de bază, precum și pachetele lubridate și timeperiodsR)

Cuprins

Dacă ești interesat de analiza datelor, în special limbajul R, s-ar putea să fii interesat de canalele mele telegram și youtube Majoritatea conținutului care este dedicat limbajului R.

  1. Lucrul cu date în sintaxa de bază R
    1.1. Conversia textului în dată
    1.2. Extracția componentelor datei în R de bază
  2. Lucrul cu date folosind pachetul lubridate
    2.1. Conversia textului în dată cu ajutorul lubridate
    2.2. Extracția componentelor datei folosind pachetul lubridate
    2.3. Operații aritmetice cu date
  3. Lucru simplificat cu perioade, pachetul timeperiodsR
    3.1. Intervale de timp în timeperiodsR
    3.2. Filtrarea vectorilor de date cu ajutorul timeperiodsR
  4. Concluzie

Lucrul cu date în sintaxa de bază R

Conversia textului în dată

În R de bază există un set de funcții pentru lucrul cu date. Dezavantajul sintaxei de bază este că registrul numelui și argumentelor funcțiilor este foarte diversificat și practic nu are o legătură logică. Totuși, este important să cunoști funcțiile de bază ale limbajului, așa că vom începe cu acestea.

Cel mai frecvent, atunci când încarci date în R din fișiere csv sau alte surse, primești data sub formă de text. Pentru a transforma acest text în tipul corect de date, folosește funcția 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"

Implicit as.Date() acceptă data în două formate: AAAA-MM-ZZ sau AAAA/MM/Z.
Dacă în setul tău de date datele sunt prezente într-un alt format, poți folosi argumentul format.

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

format acceptă sub formă de șir operatorii care indică un interval de timp și formatul său, cele mai frecvent utilizate valori sunt prezentate în tabelul de mai jos:

Format
Descriere

%d
Numărul zilei în lună

%a
Abrevierea numelui zilei săptămânii

%A
Numele complet al zilei săptămânii

%w
Numărul zilei săptămânii (0-6, unde 0 este duminica)

%m
Reprezentare cu două cifre a lunii (01-12)

%b
Abrevierea numelui lunii (apr, mar, …)

%B
Numele complet al lunii

%y
Reprezentare cu două cifre a anului

%Y
Reprezentare cu patru cifre a anului

%j
Numărul zilei din an (001 — 366)

%U
Numărul săptămânii în an (00 — 53), începutul săptămânii Duminică

%W
Numărul săptămânii în an (00 — 53), începutul săptămânii Luni

Astfel, "26 septembrie 2019" este numele complet al lunii, ziua și anul. Descrierea acestui format de dată cu operatorii poate fi făcută astfel:"%B %d, %Y".

Unde:

  • %B — Numele complet al lunii
  • %d — Numărul zilei în lună
  • %Y — Denotarea anului în patru cifre

Când descrieți formatul datei, este important să includeți toate caracterele suplimentare din șirul dumneavoastră, cum ar fi cratime, virgule, puncte, spații etc. În exemplul meu, "26 septembrie 2019", după dată se află o virgulă, iar în descrierea formatului trebuie să existe de asemenea o virgulă:"%B %d, %Y".

Sunt situații în care primiți o dată nu doar care nu se potrivește formatelor standard (GGGG-LL-ZZ sau GGGG/LL/ZZ), dar de asemenea într-o limbă care diferă de cea setată implicit în sistemul dumneavoastră de operare. De exemplu, ați încărcat date în care data este specificată astfel: "15 decembrie 2019". Înainte de a converti acest șir într-o dată, trebuie să schimbați limba.

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

Extracția componentelor datei în R de bază

În R-ul de bază nu există multe funcții care să permită extragerea oricărei părți a datei dintr-un obiect de clasă , precum și API-ul în stadiu de proiect.

data_curentă <- Sys.Date() # data curentă
ziua_săptămânii(data_curentă) # obțineți numărul zilei săptămânii
lunile(data_curentă) # obțineți numărul lunii în an
trimestrul(data_curentă) # obțineți numărul trimestrului în an

Pe lângă clasa principală de obiecte , precum și API-ul în stadiu de proiect în R-ul de bază există și 2 tipuri de date care stochează o marcă de timp: POSIXlt, POSIXct. Principala diferență a acestor clase față de , precum și API-ul în stadiu de proiect constă în faptul că, pe lângă dată, stochează și ora.

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

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

# "POSIXct" "POSIXt"

Funcția Sys.time() returnează data și ora curentă în formatul POSIXct. Acest format este asemănător UNIXTIME, și stochează numărul de secunde de la începutul erei UNIX (miezul nopții (UTC) de la 31 decembrie 1969 la 1 ianuarie 1970).

Clasă POSIXlt de asemenea, stochează ora și data, și toate componentele lor. Prin urmare, este un obiect cu o structură mai complexă, dar din care este ușor de obținut orice componentă a datei și orei deoarece, de fapt, POSIXlt it list.

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

Conversia datelor numerice și textuale în formate POSIX* se efectuează prin funcțiile as.POSIXct() și as.POSIXlt(). Aceste funcții au un set mic de argumente.

  • x — Număr, șir sau obiect de clasă , precum și API-ul în stadiu de proiect, care trebuie convertit;
  • tz — Fus orar, implicit "GMT";
  • format — Descrierea formatului datei în care sunt prezentate datele transmise în argumentul x;
  • origin — Utilizat doar în conversia unui număr în POSIX, acest argument trebuie să primească un obiect de dată și ora de la care începe numărătoarea secundelor. De obicei, este folosit pentru conversia din UNIXTIME.

Dacă datele dvs. despre dată și timp sunt prezentate în UNIXTIME, atunci pentru a le converti într-o dată într-o formă ușor de citit, utilizați următorul exemplu:

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

În origin puteți specifica orice marcă temporală. De exemplu, dacă în datele dvs. data și ora sunt indicate ca numărul de secunde de la 15 septembrie 2019, ora 12:15, pentru a le transforma într-o dată utilizați:

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

Lucrul cu date folosind pachetul lubridate

lubridate probabil cel mai popular pachet pentru lucrul cu date în limbajul R. Acesta vă oferă suplimentar încă trei clase.

  • durations — durata, adică numărul de secunde între două mărci temporale;
  • periods — perioadele permit efectuarea de calcule între date în intervale ușor de înțeles: zile, luni, săptămâni și așa mai departe;
  • intervals — obiecte care oferă momentul de început și de sfârșit al timpului.

Instalarea pachetelor suplimentare în limbajul R se face prin funcția standard install.packages().

Instalarea pachetului lubridate:

install.packages("lubridate")

Conversia textului în dată cu ajutorul lubridate

Funcțiile pachetului lubridate simplifică semnificativ procesul de conversie a textului în dată și vă permit să efectuați orice operații aritmetice cu date și timp.

Obținerea datei curente sau a datei și orei vă ajută funcțiile today() și now().

today() # data curentă
now()   # data și ora curentă

Pentru a transforma un șir în dată în lubridate există o întreagă familie de funcții a căror nume constau întotdeauna din trei litere, care indică secvența componentelor datei:

  • y — an
  • m — lună
  • d — zi

Lista funcțiilor pentru conversia textului în dată prin lubridate

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

Câteva exemple pentru conversia șirurilor în date:

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

După cum vedeți, lubridate este semnificativ mai eficient în recunoașterea descrierilor datelor sub formă de text și vă permite să transformați textul în dată fără a folosi operatori suplimentari pentru a descrie formatul.

Extracția componentelor datei folosind pachetul lubridate

De asemenea, cu ajutorul lubridate puteți obține orice componentă dintr-o dată:

dt <- ymd("2017 jan 21")

year(dt)  # an
month(dt) # lună
mday(dt)  # zi în lună
yday(dt)  # zi în an
wday(dt)  # zi a săptămânii

Operații aritmetice cu date

Dar, funcționalitatea cea mai importantă și principală lubridate constă în capacitatea de a efectua diverse operații aritmetice cu date.

Rotunjirea datei se face prin trei funcții:

  • floor_date — rotunjirea la cel mai apropiat timp anterior
  • ceiling_date — rotunjirea la cel mai apropiat timp viitor
  • round_date — rotunjirea la cel mai apropiat timp

Fiecare dintre aceste funcții are un argument unit, care vă permite să specificați unitatea de rotunjire: second, minute, hour, day, week, month, bimonth, quarter, season, halfyear, year

dt <- ymd("2017 jan 21")

round_date(dt, unit = "month")    # rotunjiți la lună
round_date(dt, unit = "3 month")  # rotunjiți la 3 luni
round_date(dt, unit = "quarter")  # rotunjiți la trimestru
round_date(dt, unit = "season")   # rotunjiți la sezon
round_date(dt, unit = "halfyear") # rotunjiți la semestru

Așadar, să înțelegem cum să obținem data care va fi peste 8 zile de la data curentă și să facem diferite alte calcule aritmetice între două date.

today() + days(8)   # ce dată va fi peste 8 zile
today() - months(2) # ce dată a fost acum 2 luni
today() + weeks(12) # ce dată va fi peste 12 săptămâni
today() - years(2)  # ce dată a fost acum 2 ani

Lucru simplificat cu perioade, pachetul timeperiodsR.

timeperiodsR — un pachet nou pentru lucrul cu datele, care a fost publicat pe CRAN în septembrie 2019.

Instalarea pachetului timeperiodsR:

install.packages("timeperiodsR")

Principalul său scop este definiția rapidă a unui anumit interval de timp în raport cu o dată dată. De exemplu, cu ajutorul funcțiilor sale, puteți obține cu ușurință:

  • Obțineți săptămâna, luna, trimestrul sau anul precedent în R.
  • Obțineți un număr dat de intervale de timp în raport cu dată, de exemplu, ultimele 4 săptămâni.
  • Extrageți cu ușurință componentele intervalului de timp obținut: data de început și data de sfârșit, numărul de zile incluse în interval, întreaga succesiune de date care face parte din acesta.

Numele tuturor funcțiilor din pachet timeperiodsR sunt intuitive și constau din două părți: direcția_interval, unde:

  • direcția în care trebuie să vă deplasați în raport cu data dată: last_n, previous, this, next, next_n.
  • timpul interval pentru a calcula perioada: day, week, month, quarter, year.

Setul complet de funcții:

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

Intervale de timp în timeperiodsR

Aceste funcții sunt utile în cazurile în care trebuie să construiți rapoarte pe baza datelor din săptămâna sau luna anterioară. Pentru a obține luna anterioară, utilizați funcția omonimă previous_month():

prmonth <- previous_month()

După care veți avea un obiect prmonth clasei tpr, din care este ușor să obțineți următoarele componente:

  • data de început a perioadei, în exemplul nostru este luna trecută
  • data de sfârșit a perioadei
  • numărul de zile incluse în perioadă
  • secuența datelor incluse în perioadă

De altfel, puteți obține fiecare dintre componente în moduri diferite:

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

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

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

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

De asemenea, puteți obține orice componentă folosind argumentul part, care este prezent în fiecare dintre funcțiile pachetului. Valorile posibile sunt: start, end, sequence, length.

previous_month(part = "start")    # începutul perioadei
previous_month(part = "end")      # sfârșitul perioadei
previous_month(part = "sequence") # secvența datelor
previous_month(part = "length")   # numărul de zile în perioadă

Așadar, să examinăm toate argumentele disponibile în funcțiile pachetului timeperiodsR:

  • x — Data de referință de la care se va calcula perioada de timp, implicit data curentă;
  • n — Numărul de intervale care vor fi incluse în perioadă, de exemplu ultimele 3 săptămâni;
  • part — Ce componentă a obiectului tpr doriți să obțineți, implicit all;
  • week_start — Argumentul este prezent doar în funcțiile care lucrează cu săptămâni și permite stabilirea numărului zilei săptămânii care va fi considerată începutul, implicit începutul săptămânii este luni, dar puteți specifica orice de la 1 - luni la 7 - duminică.

Astfel, puteți calcula orice perioadă de timp în raport cu data curentă sau orice altă dată specificată; voi da încă câteva exemple:

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

 Perioada de timp: de la 9 septembrie 2019, luni, până la 29 septembrie 2019, duminică

6 octombrie este duminică:
Lucrul cu datele în limbajul R (funcționalități de bază, precum și pachetele lubridate și timeperiodsR)

Avem nevoie de o perioadă care în raport cu 6 octombrie va lua ultimele 3 săptămâni, fără să includă săptămâna în care se află 6 octombrie. Așadar, aceasta este perioada de la 9 până la 29 septembrie.

Lucrul cu datele în limbajul R (funcționalități de bază, precum și pachetele lubridate și timeperiodsR)

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

 Perioada de timp: de la 1 mai 2019, miercuri, până la 31 mai 2019, vineri

În acest exemplu, ne interesează luna care a fost acum 4 luni, având ca referință data de 16 septembrie 2019, așadar aceasta a fost mai 2019.

Filtrarea vectorilor de date cu ajutorul timeperiodsR

Pentru filtrarea datelor în timeperiodsR există mai mulți operatori:

  • %left_out% — compară două obiecte de clasă tpr și returnează valorile din stânga, care lipsesc din dreapta.
  • %left_in% — compară două obiecte de clasă tpr și returnează datele din obiectul din stânga care sunt incluse în cel din dreapta.
  • %right_out% — compară două obiecte de clasă tpr și returnează valorile din dreapta, care lipsesc din stânga.
  • %right_in% — compară două obiecte de tip tpr și returnează datele din obiectul din dreapta care se află în cel din stânga.

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

period1 %left_in% period2   # obține datele din period1 care se află în period2
period1 %left_out% period2  # obține datele din period1 care nu se află în period2
period1 %right_in% period2  # obține datele din period2 care se află în period1
period1 %right_out% period2 # obține datele din period2 care nu se află în period1

Pachetul timeperiodsR are un oficial, în limba română playlist pe YouTube.

Concluzie

Am analizat în detaliu clasele de obiecte destinate în limbajul R pentru lucrul cu datele. De asemenea, acum știi să efectuezi operații aritmetice pe date și să obții rapid orice intervale temporale cu ajutorul pachetului timeperiodsR.

Dacă ești interesat de limbajul R, te invit să te abonezi la canalul meu de Telegram R4marketing, în care împărtășesc zilnic materiale utile despre aplicarea limbajului R în soluționarea sarcinilor mele de zi cu zi.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster