Puna me datat në gjuhën R (mundësitë themelore, si dhe paketat lubridate dhe timeperiodsR)

Merrni datën aktuale në çdo gjuhë programimi, operacion ekuivalent "Hello world!". Gjuha R nuk është përjashtim.

Në këtë artikull ne do të shqyrtojmë se si funksionon puna me datat në sintaksën themelore të gjuhës R, si dhe do të shqyrtojmë disa paketa të dobishme që zgjerojnë mundësitë e saj në punën me data:

  • lubridate — paketë që lejon kryerjen e llogaritjeve aritmetike midis datave;
  • timeperiodsR — paketë për punën me intervalet e kohës dhe komponentët e tyre.

Puna me datat në gjuhën R (mundësitë themelore, si dhe paketat lubridate dhe timeperiodsR)

Përmbajtja

Nëse jeni të interesuar në analizën e të dhënave, veçanërisht në gjuhën R, ndoshta do t’ju interesojnë kanalet e mia. telegram dhe youtube Shumica e përmbajtjes së tyre është e dedikuar gjuhës R.

  1. Puna me datat në sintaksën themelore të R
    1.1. Transformimi i tekstit në datë
    1.2. Nxjerrja e komponentëve të datës në R-në themelore
  2. Puna me datat përmes paketës lubridate
    2.1. Transformimi i tekstit në datë përmes lubridate
    2.2. Nxjerrja e komponentëve të datave përmes paketës lubridate
    2.3. Operacione aritmetike me datat
  3. Puna e thjeshtuar me periudha, paketë timeperiodsR
    3.1. Intervalet e kohës në timeperiodsR
    3.2. Filtrimi i vektorit të datave me timeperiodsR
  4. Përfundimi

Puna me datat në sintaksën themelore të R

Transformimi i tekstit në datë

Në R-në bazik ka një set funksionesh për punën me datat. Disavantazhi i sintaksës bazike është se regjistri i emrave dhe argumenteve të funksioneve është shumë i përhapur dhe në praktikë nuk ka një lidhje logjike. Megjithatë, duhet të njihni funksionet bazike të gjuhës, ndaj do të fillojmë me to.

Më së shpeshti, kur ngarkoni të dhëna në R, nga skedarë csv ose burime të tjera, merrni datën si tekst. Për ta konvertuar këtë tekst në tipin e duhur të të dhënave, përdorni funksionin 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"

Në mënyrë të paracaktuar as.Date() pranon datën në dy formate: YYYY-MM-DD ose YYYY/MM/DD.
Nëse në setin tuaj të të dhënave datat përfaqësohen në ndonjë format tjetër, për ta konvertuar mund të përdorni argumentin format.

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

format pranon në formatin e vargut operatorët që përcaktojnë një interval kohor dhe formatin e tij; vlerat më të përdorura janë të listuara në tabelën më poshtë:

Formati
Përshkrimi

%d
Numri i ditës në muaj

%a
Abreviatura e emrit të ditës së javës

%A
Emri i plotë i ditës së javës

%w
Numri i ditës së javës (0-6, ku 0 është e diela)

%m
Shënimi dyshifror i muajit (01-12)

%b
Abreviatura e emrit të muajit (apr, mar, …)

%B
Emri i plotë i muajit

%y
Shkronjë dyshifrore për vitin

%Y
Shkronjë katërshifrore për vitin

%j
Numri i ditës në vit (001 — 366)

%U
Numri i javës në vit (00 — 53), fillimi i javës të Dielën

%W
Numri i javës në vit (00 — 53), fillimi i javës të Hënën

Prandaj, "26 Shtator, 2019" është — emri i plotë i muajit, dita dhe viti. Të përshkruash këtë format date me operatorët mund të thuhet kështu:"%B %d, %Y".

Ku:

  • %B — Emri i plotë i muajit
  • %d — Numri i ditës në muaj
  • %Y — Shkronjë katërshifrore për vitin

Kur përshkruani formatin e datës, është e rëndësishme të përfshihni të gjitha simbolet shtesë nga stringu juaj, si p.sh. presjet, pikë, hapësira dhe kështu me radhë. Në shembullin tim, "26 Shtator, 2019", pas datës ka një presje, dhe gjithashtu duhet të vendosni një presje në përshkrimin e formatit:"%B %d, %Y".

Ka raste kur merrni një datë që jo vetëm se nuk përputhet me formatet standarde (YYYY-MM-DD ose YYYY/MM/DD), por gjithashtu është në një gjuhë që ndryshon nga ajo e vendosur në sistemin tuaj operative siç është e paracaktuar. Për shembull, keni ngarkuar të dhëna ku data shfaqet kështu: "15 Dhjetor, 2019." Para se të konvertoni këtë string në datë, duhet të ndryshoni lokalitetin.

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

Nxjerrja e komponentëve të datës në R-në themelore

Në R të bazës nuk ka shumë funksione që lejojnë nxjerrjen e ndonjë pjese nga data e një objekti të klasës Data.

current_date <- Sys.Date() # data aktuale
weekdays(current_date)     # merr numrin e ditës së javës
months(current_date)       # merr numrin e muajit në vit
quarters(current_date)     # merr numrin e tremujorit në vit

Përveç klasës kryesore të objekteve Data në R të bazës ka edhe 2 lloje të dhënash që ruajnë një shenjë kohe: POSIXlt, POSIXct. Dallimi kryesor midis këtyre klasave Data është se përveç datës ato ruajnë edhe kohën.

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

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

# "POSIXct" "POSIXt"

Funksioni Sys.time() kthehet data dhe koha aktuale në formatin POSIXct. Ky format është ndjeshëm i ngjashëm me UNIXTIME, dhe ruan numrin e sekondave që nga fillimi i erës UNIX (mesnata (në UTC) nga 31 dhjetori 1969 deri më 1 Janar 1970).

Klasa POSIXlt përveç kësaj ruan kohën dhe datën, dhe të gjitha komponentët e tyre. Prandaj është një objekt me një strukturë më të komplikuar, por nga i cili është e lehtë të marrësh çdo komponent të dates dhe kohës, pasi në thelb POSIXlt kjo 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  # часовой пояс

Transformimi i të dhënave numerike dhe tekstuale në formate POSIX* realizohet me funksionet as.POSIXct() dhe as.POSIXlt(). Këto funksione kanë një grup të vogël argumentesh.

  • x — Numri, stringu ose objekti i klasës Data, i cili duhet të transformohet;
  • tz — Zona orare, në përputhje me parazgjedhjen "GMT";
  • format — Përshkrimi i formatit të datës në të cilin paraqiten të dhënat e transmetuara në argumentin x;
  • origin — Përdoret vetëm gjatë konvertimit të numrit në POSIX, në këtë argument duhet të kaloni një objekt datash dhe koha nga e cila fillon numërimi i sekondave. Ndonjëherë përdoret për të kthyer nga UNIXTIME.

Nëse të dhënat tuaja për datën dhe kohën janë të paraqitura në UNIXTIME, atëherë për t'i konvertuar ato në një datë të kuptueshme, përdorni shembullin e mëposhtëm:

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

Në origin mund të specifikoni çdo shenjë të kohës. Për shembull, nëse në të dhënat tuaja data dhe koha janë të shënuara si numri i sekondave duke filluar nga 15 Shtatori 2019 ora 12:15, atëherë për ta kthyer në një datë, përdorni:

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

Puna me datat përmes paketës lubridate

lubridate ndoshta paketa më e njohur për punën me datat në gjuhën R. Ajo ju ofron gjithashtu tri klasa të tjera.

  • durations — kohëzgjatja, dmth. numri i sekondave midis dy shenjave të kohës;
  • periods — periudhat lejojnë kryerjen e llogaritjeve midis datave me intervale të kuptueshme për njeriun: ditë, muaj, javë dhe kështu me radhë;
  • intervals — objekte që ofrojnë momentin fillestar dhe përfundimtar të kohës.

Instalimi i pakove shtesë në gjuhën R realizohet me funksionin standard install.packages().

Instalimi i paketës lubridate:

install.packages("lubridate")

Transformimi i tekstit në datë përmes lubridate

Funksionet e paketës lubridate e thjeshtojnë ndjeshëm procesin e konvertimit të tekstit në datë dhe gjithashtu ju lejojnë të kryeni çdo operacion aritmetik me datat dhe kohën.

Për të marrë datën aktuale, ose datën dhe kohën, do t'ju ndihmojnë funksionet today() dhe now().

today() # data aktuale
now()   # data dhe ora aktuale

Për të konvertuar një varg në datë në lubridate ekziston një familje e tërë funksionesh, emrat e të cilëve përbëhen gjithmonë nga tri shkronja dhe tregojnë renditjen e komponentëve të datës:

  • y — viti
  • m — muaji
  • d — dita

Lista e funksioneve për konvertimin e tekstit në datë përmes lubridate

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

Disa shembuj për konvertimin e vargjeve në data:

ymd("2017 jan 21")
mdy("20 mars, 2019")
dmy("1 prill 2018")

Siç e shihni lubridate është ndjeshëm më efektive në njohjen e përshkrimeve të datave në formë teksti dhe ju lejon të konvertoni tekstin në datë pa përdorur operatorë shtesë për përshkrimin e formatit.

Nxjerrja e komponentëve të datave përmes paketës lubridate

Po ashtu, me anë të lubridate mund të merrni çdo komponent nga data:

dt <- ymd("2017 jan 21")

year(dt)  # viti
month(dt) # muaji
mday(dt)  # dita në muaj
yday(dt)  # dita në vit
wday(dt)  # dita e javës

Operacione aritmetike me datat

Por, funksionaliteti më i rëndësishëm dhe kryesor lubridate përfshin mundësinë për të bërë operacione të ndryshme aritmetike me datat.

Rrethimi i datës bëhet me tre funksione:

  • floor_date — rrethim në kohën më të afërt të kaluar
  • ceiling_date — rrethim në kohën më të afërt të ardhshme
  • round_date — rrethim në kohën më të afërt

Çdo funksion nga këto ka argumentin unit, i cili ju lejon të shënoni njësinë e rrethimit: sekond, minutë, orë, ditë, javë, muaj, dy muaj, tremujor, stinë, gjysmëvjetor, vit

dt <- ymd("2017 jan 21")

round_date(dt, unit = "month")    # rrethim deri në muaj
round_date(dt, unit = "3 month")  # rrethim deri në 3 muaj
round_date(dt, unit = "quarter")  # rrethim deri në tremujor
round_date(dt, unit = "season")   # rrethim deri në stinë
round_date(dt, unit = "halfyear") # rrethim deri në gjysmëvjetor

Pra, le të shikojmë si të marrim datën që do të jetë 8 ditë pas datës aktuale dhe të kryejmë llogaritje të ndryshme aritmetike midis dy datave.

today() + days(8)   # cila do të jetë data 8 ditë më vonë
today() - months(2) # cila ishte data 2 muaj më parë
today() + weeks(12) # cila do të jetë data 12 javë më vonë
today() - years(2)  # cila ishte data 2 vjet më parë

Puna e thjeshtuar me periudha, paketa timeperiodsR.

timeperiodsR — një paketë e re për punën me datat e publikuar në CRAN në shtator 2019.

Instalimi i paketës timeperiodsR:

install.packages("timeperiodsR")

Qëllimi kryesor — përcaktimi i shpejtë i një intervali kohor në raport me një datë të caktuar. Për shembull, me funksionet e tij ju lehtë mund të:

  • Merrni javën, muajin, tremujorin ose vitin e kaluar në R.
  • Merrni një numër të caktuar intervalesh kohorë në raport me datën, siç janë katër javët e kaluara.
  • Lehtë të nxirrni komponentët nga intervali kohor të marrë: datën fillestare dhe përfundimtare, numrin e ditëve që bien në interval, të gjithë sekuencën e datave që përfshihen.

Emrat e të gjitha funksioneve të paketës timeperiodsR janë intuitivë dhe përbëhen nga dy pjesë: drejtim_intervali, ku:

  • drejtim në të cilin duhet të lëvizni në raport me një datë të caktuar: last_n, previous, this, next, next_n.
  • kohor intervali për të llogaritur periudhën: ditë, javë, muaj, tremujor, vit.

Grupi i plotë i funksioneve:

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

Intervalet e kohës në timeperiodsR

Këto funksione janë të dobishme kur ju nevojitet të krijoni raportet në bazë të të dhënave nga java ose muaji i kaluar. Për të marrë muajin e kaluar, përdorni funksionin e njëjtë. previous_month():

prmonth <- previous_month()

Pas kësaj, do të keni një objekt prmonth klasës tpr, nga i cili lehtësisht mund të merrni komponentët e mëposhtëm:

  • data e fillimit të periudhës, në shembullin tonë kjo është muaji i kaluar
  • data e përfundimit të periudhës
  • numri i ditëve që hyjnë në periudhë
  • sekuenca e datave që hyjnë në periudhë

Dhe çdo komponent mund të merret në mënyra të ndryshme:

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

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

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

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

Gjithashtu mund të merrni cilindo nga komponentët duke përdorur argumentin part, i cili është i pranishëm në secilën nga funksionet e paketës. Vlerat e mundshme: start, end, sequence, length.

previous_month(part = "start")    # fillimi i periudhës
previous_month(part = "end")      # fundi i periudhës
previous_month(part = "sequence") # sekuenca e datave
previous_month(part = "length")   # numri i ditëve në periudhë

Pra, le të shqyrtojmë të gjitha argumentet e disponueshme në funksionet e paketës timeperiodsR:

  • x — Data e referencës nga e cila do të llogaritet periudha, me default data aktuale;
  • n — Numri i intervaleve që do të hyjnë në periudhë, për shembull 3 javët e kaluara;
  • part — Cili komponent i objektit tpr ju duhet të merrni, siç është e paracaktuar all;
  • java_fillestare — Argumenti është i pranishëm vetëm në funksionet që punojnë me javët dhe lejon të përcaktoni numrin e ditës së javës që do të konsiderohet fillimi i saj, siç është e paracaktuar, fillimi i javës është e hëna, por mund të përcaktoni çdo ditë nga 1 — e hëna deri në 7 — e diela.

Kështu, mund të llogaritni çdo periudhë kohe në lidhje me datën aktuale, ose çdo datë tjetër të caktuar, do të jap disa shembuj të tjerë:

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

 Periudha e kohës: nga 9 Shtatori i 2019, e hënë deri më 29 Shtator 2019, e dielë

6 Tetori është e diela:
Puna me datat në gjuhën R (mundësitë themelore, si dhe paketat lubridate dhe timeperiodsR)

Na nevojitet një periudhë, që në lidhje me 6 Tetorin do të marrë 3 javët e mëparshme. Pa përfshirë javën në të cilën bie vetë 6 Tetori. Prandaj, kjo është periudha nga 9 deri më 29 Shtator.

Puna me datat në gjuhën R (mundësitë themelore, si dhe paketat lubridate dhe timeperiodsR)

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

 Periudha e kohës: nga 1 Maji i 2019, e mërkurë deri më 31 Maji i 2019, e premte

Në këtë shembull, na intereson muaji që ishte 4 muaj më parë, duke u nisur nga 16 Shtatori i vitit 2019, prandaj ky ishte maji i vitit 2019.

Filtrimi i vektorit të datave me timeperiodsR

Për filtrimin e datave në timeperiodsR ka disa operatorë:

  • %left_out% — krahaso dy objekte të klasës tpr, dhe kthe vlerën nga e majta, e cila mungon në të djathtën.
  • %left_in% — krahasohet dy objekte të klasës tpr, dhe kthen datat nga objekti i majtë që bien në të djathtin.
  • %right_out% — krahasohet dy objekte të klasës tpr, dhe kthen vlerën nga djathtas, që mungojnë në të majtën.
  • %right_in% — krahasohet dy objekte të klasës tpr, dhe kthen datat nga objekti i djathtë që janë të pranishme në të majtën.

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

period1 %left_in% period2   # merrni datat nga period1 që bien në period2
period1 %left_out% period2  # merrni datat nga period1 që nuk bien në period2
period1 %right_in% period2  # merrni datat nga period2 që bien në period1
period1 %right_out% period2 # merrni datat nga period2 që nuk bien në period1

Paketa timeperiodsR ka një playlist zyrtare në gjuhën ruse në YouTube.

Përfundimi

Ne shqyrtuam në detaje klasat e objekteve të destinuara në gjuhën R për punën me datat. Po ashtu, tani dini të kryeni operacione aritmetike mbi datat, dhe të merrni shpejt çdo periudhë kohore me ndihmën e paketës timeperiodsR.

Nëse jeni të interesuar për gjuhën R, ju ftoj të abonoheni në kanalin tim të Telegramit R4marketing, ku çdo ditë ndaj materiale të dobishme për përdorimin e gjuhës R në zgjidhjen e detyrave të mia përditshme.

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster