Puna me datat në R (aftësitë bazë, si dhe paketat e lubridimit dhe periudhave kohore R)

Merrni datën aktuale në çdo gjuhë programimi, një operacion i barabartë me "Hello world!" Gjuha R nuk bën përjashtim.

Në këtë artikull, ne do të shikojmë se si funksionon puna me datat në sintaksën bazë të gjuhës R, dhe gjithashtu do të shikojmë disa paketa të dobishme që zgjerojnë aftësitë e saj kur punoni me data:

  • lubridate — një paketë që ju lejon të kryeni llogaritjet aritmetike midis datave;
  • timeperiodsR — një paketë për të punuar me intervalet kohore dhe komponentët e tyre.

Puna me datat në R (aftësitë bazë, si dhe paketat e lubridimit dhe periudhave kohore R)

Përmbajtje

Nëse jeni të interesuar për analizën e të dhënave, dhe në veçanti gjuhën R, mund të jeni të interesuar për mua telegram и youtube kanalet. Pjesa më e madhe e përmbajtjes i kushtohet gjuhës R.

  1. Puna me datat në sintaksën bazë R
    1.1. Konvertoni tekstin në datë
    1.2. Nxjerrja e komponentëve të datës në R bazë
  2. Puna me datat duke përdorur paketën e lubridimit
    2.1. Konvertoni tekstin në datë duke përdorur lubridate
    2.2. Nxjerrja e komponentëve të datës duke përdorur paketën e lubridimit
    2.3. Veprime aritmetike me data
  3. Puna e thjeshtuar me periudha, paketa e periudhave kohore
    3.1. Intervalet kohore në periudha kohoreR
    3.2. Filtrimi i një vektori datash duke përdorur periudha kohoreR
  4. Përfundim

Puna me datat në sintaksën bazë R

Konvertoni tekstin në datë

Basic R ka një sërë funksionesh për të punuar me datat. Disavantazhi i sintaksës bazë është se rasti i emrave dhe argumenteve të funksioneve është shumë i shpërndarë dhe praktikisht nuk ka lidhje logjike. Megjithatë, ju duhet të dini funksionet themelore të gjuhës, kështu që ne do të fillojmë me to.

Më shpesh kur ngarkoni të dhëna në R, nga skedarët csv ose burime të tjera, ju merrni një datë si tekst. Për ta kthyer këtë tekst në llojin e saktë 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"

By default as.Date() pranon datën në dy formate: VVVV-MM-DD ose YYYY/MM/DD.
Nëse grupi juaj i të dhënave përmban data në ndonjë format tjetër, mund të përdorni argumentin format.

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

format pranon operatorë në formë vargu që tregojnë çdo interval kohor dhe formatin e tij; vlerat më të përdorura janë paraqitur në tabelën më poshtë:

Format
Përshkrim

%d
Numri i ditës në muaj

%a
Shkurtim për emrin e 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 diel)

%m
Përcaktimi muajor me dy shifra (01-12)

%b
Shkurtesa e emrit të muajit (prill, mars, ...)

%B
Emri i muajit të plotë

%y
Përcaktimi i vitit me dy shifra

%Y
Emërtimi vjetor me katër shifra

%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 e hënë

Prandaj, "26 shtator 2019" është emri i plotë i muajit, datës dhe vitit. Ky format i datës mund të përshkruhet duke përdorur operatorët si më poshtë:"%B %d, %Y".

Ku:

  • %B - Emri i plotë i muajit
  • %d - Numri i ditës në muaj
  • %Y — Përcaktimi i vitit me katër shifra

Kur përshkruani formatin e datës, është e rëndësishme të përfshini të gjitha karakteret shtesë nga vargu juaj, të tilla si vizat, presjet, pikat, hapësirat, etj. Në shembullin tim, "26 shtator 2019", ka një presje pas datës, dhe gjithashtu duhet të vendosni një presje në përshkrimin e formatit:"%B %d, %Y".

Ka situata kur merrni një datë që jo vetëm që nuk korrespondon me formatet standarde (VVVV-MM-DD ose VVVV/MM/DD), por edhe në një gjuhë që ndryshon nga ajo e paracaktuar e instaluar në sistemin tuaj operativ. Për shembull, keni shkarkuar të dhëna ku data tregohet si kjo: "15 dhjetor 2019". Përpara se ta konvertoni këtë varg në një datë, duhet të ndryshoni vendndodhjen.

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

Nxjerrja e komponentëve të datës në R bazë

Nuk ka shumë funksione në R bazë që ju lejojnë të nxirrni ndonjë pjesë të një date nga një objekt i klasës data.

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

Përveç klasës së objektit kryesor data në R bazë ka 2 lloje të tjera të dhënash që ruajnë një vulë kohore: POSIXlt, POSIXct. Dallimi kryesor midis këtyre klasave dhe data është se përveç datës që ruajnë kohën.

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

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

# "POSIXct" "POSIXt"

Funksion Sys.time() kthen datën dhe orën aktuale në format POSIXct. Ky format është i ngjashëm në kuptim me NJOFTIM, dhe ruan numrin e sekondave që nga fillimi i epokës UNIX (mesnatë (UTC) nga 31 dhjetor 1969 deri më 1 janar 1970).

Klasë POSIXlt ruan gjithashtu kohën dhe datën, si dhe të gjithë përbërësit e tyre. Prandaj, ai është një objekt me një strukturë më komplekse, por nga i cili është e lehtë të merret ndonjë komponent i datës dhe kohës sepse në fakt POSIXlt это 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  # часовой пояс

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

  • x - Numri, vargu ose objekti i klasës data, e cila duhet të konvertohet;
  • tz - Zona kohore, e paracaktuar "GMT";
  • format — Përshkrimi i formatit të datës në të cilin paraqiten të dhënat e kaluara në argumentin x;
  • origjina — Përdoret vetëm kur konvertohet një numër në POSIX; duhet të kaloni një objekt datë dhe kohë nga e cila numërohen sekondat në këtë argument. Zakonisht përdoret për përkthim nga UNIXTIME.

Nëse informacioni juaj për datën dhe orën është i përfshirë NJOFTIM, pastaj për t'i kthyer ato në një datë të qartë dhe të lexueshme, përdorni shembullin e mëposhtëm:

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

Në origjinë mund të specifikoni çdo vulë kohore. Për shembull, nëse të dhënat tuaja përmbajnë datën dhe kohën si numër sekondash që nga data 15 shtator 2019 ora 12:15, atëherë për t'i kthyer ato në një datë përdorni:

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

Puna me datat duke përdorur paketën e lubridimit

lubridate Ndoshta paketa më e njohur për të punuar me datat në gjuhën R. Ju ofron tre klasa shtesë.

  • kohëzgjatje - kohëzgjatje, d.m.th. numri i sekondave ndërmjet dy vulave kohore;
  • periudhat - periudhat ju lejojnë të bëni llogaritjet midis datave në intervale të lexueshme nga njeriu: ditë, muaj, javë, e kështu me radhë;
  • intervale - objekte që ofrojnë pikën e fillimit dhe të përfundimit në kohë.

Instalimi i paketave shtesë në gjuhën R kryhet duke përdorur funksionin standard install.packages().

Instalimi i paketës lubridate:

install.packages("lubridate")

Konvertoni tekstin në datë duke përdorur lubridate

Karakteristikat e paketës lubridate thjeshton ndjeshëm procesin e konvertimit të tekstit në një datë, dhe gjithashtu ju lejon të kryeni çdo operacion aritmetik me data dhe kohë.

Funksionet do t'ju ndihmojnë të merrni datën ose datën dhe orën aktuale today() и now().

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

Për të kthyer një varg në një datë në lubridate Ekziston një familje e tërë funksionesh, emrat e të cilëve përbëhen gjithmonë nga tre shkronja dhe tregojnë sekuencën e komponentëve të datës:

  • y - vit
  • m - muaj
  • d - ditë

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

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

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

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

Siç mund ta shihni lubridate Është shumë më efikas në njohjen e përshkrimeve të datave si tekst dhe ju lejon të konvertoni tekstin në datë pa përdorur operatorë shtesë për të përshkruar formatin.

Nxjerrja e komponentëve të datës duke përdorur paketën e lubridimit

Gjithashtu duke përdorur lubridate ju mund të merrni çdo komponent nga një datë:

dt <- ymd("2017 jan 21")

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

Veprime aritmetike me data

Por funksionaliteti më i rëndësishëm dhe themelor lubridate është aftësia për të kryer veprime të ndryshme aritmetike me data.

Rrumbullakimi i datës kryhet nga tre funksione:

  • floor_date - rrumbullakimi në kohën më të afërt të së shkuarës
  • ceiling_date - rrumbullakimi në kohën e së ardhmes së afërt
  • round_date - rrumbullakimi në kohën më të afërt

Secili prej këtyre funksioneve ka një argument njësie cila ju lejon të specifikoni njësinë e rrumbullakosjes: sekonda, minutë, orë, ditë, javë, muaj, dymuaj, tremujor, sezon, gjysmë viti, viti

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

Pra, le të kuptojmë se si të marrim një datë që është 8 ditë pas datës aktuale dhe të bëjmë llogaritje të tjera aritmetike midis dy datave.

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

Puna e thjeshtuar me periudha, paketa e periudhave kohore.

timeperiodsR — një paketë e re për të punuar me datat që u publikua në CRAN në shtator 2019.

Instalimi i paketës timeperiodsR:

install.packages("timeperiodsR")

Qëllimi kryesor është përcaktimi i shpejtë i një intervali kohor të caktuar në lidhje me një datë të caktuar. Për shembull, duke përdorur 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 kohore në lidhje me një datë, për shembull 4 javët e fundit.
  • Është e lehtë të nxirren përbërësit e tij nga intervali kohor që rezulton: data e fillimit dhe e mbarimit, numri i ditëve të përfshira në interval, e gjithë sekuenca e datave që përfshihen në të.

Emri i të gjitha funksioneve të paketës timeperiodsR janë intuitive dhe përbëhen nga dy pjesë: drejtimi_interval, ku:

  • drejtimi në të cilën ju duhet të lëvizni në lidhje me një datë të caktuar: last_n, mëparshme, kjo, tjetër, next_n.
  • i përkohshëm interval për të llogaritur periudhën: ditë, javë, muaj, tremujor, vit.

Kompleti i plotë i veçorive:

  • 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 kohore në periudha kohoreR

Këto funksione janë të dobishme në rastet kur ju duhet të krijoni raporte bazuar në të dhënat e javës ose muajit të kaluar. Për të marrë muajin e fundit, përdorni funksionin me të njëjtin emër previous_month():

prmonth <- previous_month()

Pas së cilës do të keni një objekt prmuaj klasë prpr, nga të cilat mund të merren lehtësisht përbërësit e mëposhtëm:

  • data e fillimit të periudhës, në shembullin tonë ky është muaji i fundit
  • data e përfundimit të periudhës
  • numri i ditëve të përfshira në periudhë
  • sekuenca e datave të përfshira në periudhë

Për më tepër, ju mund të merrni secilin nga komponentët në mënyra të ndryshme:

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

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

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

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

Ju gjithashtu mund të merrni ndonjë nga komponentët duke përdorur argumentin pjesë, e cila është e pranishme në secilin prej funksioneve të paketës. Vlerat e mundshme: fillimi, fundi, sekuenca, gjatësia.

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

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

  • x — Data e referencës nga e cila do të llogaritet periudha kohore, data aktuale si parazgjedhje;
  • n — Numri i intervaleve që do të përfshihen në periudhë, për shembull 3 javët e mëparshme;
  • part - Cila përbërëse e objektit tpr ju duhet të merrni, si parazgjedhje all;
  • week_start — Argumenti është i pranishëm vetëm në funksionet për të punuar me javë dhe ju lejon të caktoni numrin e ditës së javës që do të konsiderohet fillimi i saj. Si parazgjedhje, fillimi i javës është e hëna, por ju mund të vendosni ndonjë nga 1 - e hëna deri në 7 - e diel.

Kështu, ju mund të llogarisni çdo periudhë kohore në lidhje me datën aktuale ose ndonjë datë tjetër të dhënë; këtu janë disa shembuj të tjerë:

# получить 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 tetori është e diel:
Puna me datat në R (aftësitë bazë, si dhe paketat e lubridimit dhe periudhave kohore R)

Ne kemi nevojë për një periudhë që, në raport me 6 tetorin, do të zgjasë 3 javët e mëparshme. Pa përfshirë javën që përfshin vetë 6 tetorin. Prandaj, kjo është periudha nga 9 shtatori deri më 29 shtator.

Puna me datat në R (aftësitë bazë, si dhe paketat e lubridimit dhe periudhave kohore R)

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

Në këtë shembull na intereson muaji që ka qenë 4 muaj më parë, nëse fillojmë nga data 16 shtator 2019, atëherë ka qenë maj 2019.

Filtrimi i një vektori datash duke përdorur periudha kohoreR

Për të filtruar datat në timeperiodsR Ka disa operatorë:

  • %left_out% - krahason dy objekte të klasës tpr dhe kthen vlerën nga e majta që mungon në të djathtën.
  • %left_in% - krahason dy objekte të klasës tpr dhe kthen datat nga objekti i majtë që përfshihen në atë të djathtë.
  • %right_out% - krahason dy objekte të klasës tpr dhe kthen vlerën nga e djathta që mungon nga e majta.
  • %right_in% - krahason dy objekte të klasës tpr dhe kthen datat nga objekti i djathtë që janë të pranishëm në atë të majtë.

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

Në paketë timeperiodsR ekziston një zyrtar në gjuhën ruse Lista e luajtjes në YouTube.

Përfundim

Ne shqyrtuam në detaje klasat e objekteve që janë krijuar në gjuhën R për të punuar me datat. Gjithashtu tani mund të kryeni veprime aritmetike në data dhe të merrni shpejt çdo periudhë kohore duke përdorur paketën timeperiodsR.

Nëse jeni të interesuar për gjuhën R, ju ftoj të abonoheni në kanalin tim të telegramit R4marketing, në të cilën unë ndaj çdo ditë materiale të dobishme në lidhje me përdorimin e gjuhës R në zgjidhjen e problemeve tuaja të përditshme.

Burimi: www.habr.com

Shto një koment