Merrni datën aktuale në çdo gjuhë programimi, operacioni është ekuivalent me "Hello world!". Gjuha R nuk është një përjashtim.
Në këtë artikull do të shqyrtojmë si funksionon puna me datat në sintaksën bazë të gjuhës R, si dhe do të shqyrtojmë disa paketa të dobishme që zgjerimin e mundësive të saj për punën me datat:
lubridate— paketa që lejon kryerjen e llogaritjeve aritmetike midis datave;timeperiodsR— paketa për punën me intervalet kohore dhe komponentët e tyre.

Përmbajtja
Nëse jeni të interesuar për analizën e të dhënave, veçanërisht gjuhën R, ndoshta do t'ju interesojnë kanalët e mi dhe Gati të gjitha përmbajtjet e tyre i kushtohen gjuhës R.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
Puna me datat në sintaksën bazë të R
Shndërrimi i tekstit në datë
Në R bazik ekziston një grup funksionesh për punën me datat. Minus i sintaksës bazë është se emrat dhe argumentet e funksioneve janë shumë të shpërndara dhe praktikisht nuk kanë një lidhje logjike. Megjithatë, funksionet bazë të gjuhës duhet të njihen, prandaj do të fillojmë pikërisht me to.
Më shpesh kur ngarkoni të dhëna në R, nga skedarët csv, ose burime të tjera, merrni datën si tekst. Për ta sjellë këtë tekst në formatin e duhur të të dhënave, përdorim 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"Më në default as.Date() merr datën në dy formate: YYYY-MM-DD ose YYYY/MM/DD.
Nëse në grupin tuaj të të dhënave datat janë të paraqitura në ndonjë format tjetër, për shndërrimin mund të përdorni argumentin format.
as.Date("September 26, 2019", format = "%B %d, %Y")format merr në formatin string operatorët që shënojnë ndonjë 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
Simboli dyshifror i muajit (01-12)
%b
Abreviatura e emrit të muajit (apr, mar, …)
%B
Emri i plotë i muajit
%y
Simboli dyshifror i vitit
%Y
Simboli katërshifror i vitit
%j
Numri i ditës në vit (001 — 366)
%U
Numri i javës në vit (00 — 53), fillimi i javës e Dielë
%W
Numri i javës në vit (00 — 53), fillimi i javës e Hënë
Përkatësisht, "26 Shtator 2019" është – emri i plotë i muajit, numri dhe viti. Të përshkruhet ky 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– Emërtimi katërshifror i vitit
Kur përshkruani formatin e datës, është e rëndësishme të përfshini të gjitha simbolet shtesë nga stringu juaj, si p.sh. nëntë, presje, pika, hapësira dhe kështu me radhë. Në shembullin tim, "26 Shtator 2019", pas dates ndodhet një presje, dhe në përshkrimin e formatit gjithashtu duhet të vendoset presja:"%B %d, %Y".
Ka situata kur merrni një datë që nuk i përgjigjet formateve standarde (YYYY-MM-DD ose YYYY/MM/DD), por gjithashtu në një gjuhë që ndan nga ajo e cila është vendosur në sistemin tuaj operativ si parazgjedhje. Për shembull, keni ngarkuar të dhëna ku data është e shënuar në këtë mënyrë: "15 Dhjetor 2019". Para se të konvertoni këtë string në datë, ju nevojitet të ndryshoni lokalitetin.
# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")Nxjerrja e komponenteve të datës në R bazik
Në R bazik nuk ka shumë funksione që lejojnë të nxirren ndonjë pjesë të datës nga një objekt klase Data.
current_date <- Sys.Date() # data aktuale
weekdays(current_date) # merrni numrin e ditës së javës
months(current_date) # merrni numrin e muajit në vit
quarters(current_date) # merrni numrin e tremujorit në vitPërveç klasës kryesore të objekteve Data në R bazik ka gjithashtu 2 lloje të dhënash që ruajnë markimin e kohës: POSIXlt, POSIXct. Dallimi kryesor i këtyre klasave nga Data është se përveç datës ato ruajnë kohën.
# получить текущую дату и время
current_time <- Sys.time()
# узнать класс объекта current_time
class(current_time)# "POSIXct" "POSIXt"
Funksioni Sys.time() kthehet koha dhe data aktuale në formatin POSIXct. Ky format është në përmbajtje të ngjashme me UNIXTIME, dhe ruan numrin e sekondave nga fillimi i epokës UNIX (mesnata (në UTC) nga 31 Dhjetor 1969 deri më 1 Janar 1970).
Klasa POSIXlt gjithashtu ruan kohën dhe datën, dhe të gjitha komponentët e tyre. Prandaj është një objekt me një strukturë më të ndërlikuar, por nga i cili është e lehtë të merrni çdo komponent të datës 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ë formatet POSIX* kryhet 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, që duhet të konvertohet;
- tz — Zona kohore, parazgjedhja "GMT";
- format — Përshkrimi i formatit të datës në të cilin janë paraqitur të dhënat e kaluara në argumentin x;
- origin — Përdoret vetëm kur konvertohet një numër në POSIX, në këtë argument duhet kaluar një objekt data dhe koha nga e cila fillon numërimi i sekondave. Zakonisht përdoret për të përkthyer nga UNIXTIME.
Nëse të dhënat tuaja për datën dhe kohën janë të përfaqësuara në UNIXTIME, atëherë për t'i konvertuar ato në një datë të kuptueshme, përdorni shembullin në vijim:
# Конвертируем UNIXTIME в читаемую дату
as.POSIXlt(1570084639, origin = "1970-01-01")Në origin mund të specifikoni çdo markë kohore. Për shembull, nëse në të dhënat tuaja data dhe koha janë dhënë si numri i sekondave që nga 15 Shtatori 2019, ora 12:15, atëherë për ta transformuar në 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 tre klasa të tjera.
- durations — kohëzgjatja, pra numri i sekondave në mes dy markave kohore;
- periods — periudhat lejojnë kryerjen e llogaritjeve mes 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 paketeve shtesë në gjuhën R kryhet nga funksioni standard install.packages().
Instalimi i paketës lubridate:
install.packages("lubridate")Shndërrimi i tekstit në datë me lubridate
Funksionet e paketës lubridate në mënyrë të konsiderueshme e thjeshtojnë procesin e konvertimit të tekstit në datë, si dhe ju lejojnë të kryeni çdo operacion aritmetik me datat dhe kohën.
Të merrni datën e tanishme, ose datën dhe orën ju ndihmojnë funksionet today() dhe now().
today() # data e tanishme
now() # data dhe ora e tanishmePër të transformuar një varg në datë në lubridate ekziston një familje e tërë funksionesh emrat e të cilëve përbëhen gjithmonë nga tre letra, dhe përfaqësojnë rendin e komponenteve 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 të transformuar vargje në data:
ymd("2017 jan 21")
mdy("20 mars, 2019")
dmy("1 prill 2018")Siç e shihni lubridate është ndjeshëm më efektiv në njohjen e përshkrimeve të datave në formën e tekstit, dhe ju lejon të transformoni tekstin në datë pa përdorur operatorë shtesë për të përshkruar formatin.
Nxjerrja e komponenteve të datës me paketën lubridate
Gjithashtu 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ësOperacione aritmetike me data
Por, funksionaliteti më i rëndësishëm dhe themelor lubridate qëndron në mundësinë për të kryer operacione të ndryshme aritmetike me datat.
Raundimi i datës bëhet me tre funksione:
floor_date— raundimi në kohën më të afërt që ka kaluarceiling_date— raundimi në kohën më të afërt që do të vijëround_date— raundimi në kohën më të afërt
Secili nga këto funksione ka një argument unit, i cili ju lejon të specifikoni njësinë e raundimit: second, minute, hour, day, week, month, bimonth, quarter, season, halfyear, year
dt <- ymd("2017 jan 21")
round_date(dt, unit = "month") # raundoni në muaj
round_date(dt, unit = "3 month") # raundoni në 3 muaj
round_date(dt, unit = "quarter") # raundoni në tremujor
round_date(dt, unit = "season") # raundoni në sezon
round_date(dt, unit = "halfyear") # raundoni në gjashtë muajPra, le të shohim se si të marrim datën që do të jetë pas 8 ditësh nga data aktuale dhe të bëjmë llogaritë e ndryshme midis dy datave.
today() + days(8) # cila do të jetë data pas 8 ditësh
today() - months(2) # cila ishte data 2 muaj më parë
today() + weeks(12) # cila do të jetë data pas 12 javësh
today() - years(2) # cila ishte data 2 vjet më parëPunë 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 të caktuar kohor në raport me një datë të caktuar. Për shembull, me anë të funksioneve të saj, ju mund të:
- Merrni javën, muajin, tremujorin ose vitin e kaluar në R.
- Merrni një numër të caktuar prej intervalesh kohore në raport me datën, për shembull, 4 javët e kaluara.
- Lehtë të nxjerrësh komponentët e intervalit të marrë: datën fillestare dhe përfundimtare, numrin e ditëve të përfshira në interval, të gjithë sekuencën e datave që përfshihen.
Emrat e të gjitha funksioneve të paketës timeperiodsR janë intuitivisht të kuptueshme dhe përbëhen nga dy pjesë: drejtimi_intervali, ku:
- drejtimi në të cilin duhet të lëvizni në raport me datën e caktuar: last_n, previous, this, next, next_n.
- kohor intervali për të llogaritur periudhën: day, week, month, quarter, year.
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 kohore në timeperiodsR
Këto funksione janë të dobishme në raste kur keni nevojë të krijoni raporte mbi të dhënat për javën ose muajin e kaluar. Për të marrë muajin e kaluar përdorni funksionin përkatës previous_month():
prmonth <- previous_month()Pas kësaj, do të keni një objekt prmonth klasës tpr, prej nga lehtë mund të merrni komponentët e mëposhtëm:
- datën e fillimit të periudhës, në shembullin tonë kjo është muaji i kaluar
- datën e përfundimit të periudhës
- numrin e ditëve që përfshihen në periudhë
- renditjen e datave që përfshihen në periudhë
Gjithashtu, mund të merrni çdo nga komponentët duke përdorur argumentin
# первый день периода
prmonth$start
start(prmonth)
# последний день периода
prmonth$end
end(prmonth)
# последовательность дат
prmonth$sequence
seq(prmonth)
# количество дней входящих в период
prmonth$length
length(prmonth), i cili është i pranishëm në çdo funksion të paketës. Vlerat e mundshme: start, end, sequence, length. partprevious_month(part = "start") # fillimi i periudhës previous_month(part = "end") # fundi i periudhës previous_month(part = "sequence") # renditja 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— Data referuese nga e cila do të llogaritet periudha kohore, sipas parazgjedhjes data aktuale; timeperiodsR:
x— Numri i intervallave që do të përfshihen në periudhë, për shembull 3 javët e kaluara;n— Cili komponent i objektitpartju nevojitet për të marrë, sipas parazgjedhjestprweek_starttë gjitha;— Argumenti është i pranishëm vetëm në funksionet për punën me javët, dhe lejon të caktoni numrin e ditës së javës që do të konsiderohet si fillim, sipas parazgjedhjes fillimi i javës është e hëna, por mund të caktoni çdo ditë nga 1 — e hëna deri në 7 — e diela.Kështu, mund të llogaritni çdo periudhë kohore në lidhje me datën aktuale, ose ndonjë datë tjetër të caktuar, do të jap disa shembuj të tjerë:
Periudha kohore: nga 9 Shtatori i 2019, e Hënë deri në 29 Shtatorin e 2019, e Diel
# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06",
n = 3,
week_start = 1) 6 Tetori është e Diel:Na nevojitet një periudhë që në lidhje me 6 Tetorin do të marrë 3 javët e kaluara. Pa përfshirë javën në të cilën bie 6 Tetori vetë. Prandaj, kjo është periudha nga 9 deri në 29 Shtator.

Periudha kohore: nga 1 Maji i 2019, e Mërkurë deri në 31 Maji të 2019, e Premte

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4) Në këtë shembull na intereson muaji që ishte 4 muaj më parë, nëse e marrim për bazë datën 16 Shtator 2019, përkatësisht ky ishte maji i vitit 2019.Për filtrimin e datave në
Filtrimi i një vektori datash me timeperiodsR
ka disa operatorë: timeperiodsR %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ë hyjnë në të djathtin.
- %right_out% — krahason dy objekte të klasës tpr, dhe kthen vlerën nga e djathta që mungon në të majtën.
- Këto pjesë do të mund të përdoren për analizimin e mëtejmë të të dhënave.
- %right_in% — krahason dy objekte të klasës tpr, dhe kthen datat nga objekti i djathtë që janë të pranishme në atë të majtë.
period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")
period1 %left_in% period2 # merr datat nga period1 që janë në period2
period1 %left_out% period2 # merr datat nga period1 që nuk janë në period2
period1 %right_in% period2 # merr datat nga period2 që janë në period1
period1 %right_out% period2 # merr datat nga period2 që nuk janë në period1Pakoja timeperiodsR ka një version zyrtar në gjuhën ruse .
Përfundim
Ne shqyrtuam në hollësi klasat e objekteve që janë të destinuara në gjuhën R për të punuar me datat. Gjithashtu tani dini si 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ë regjistroheni në kanalin tim në Telegram , në të cilin përditë ndaj materiale të dobishme për përdorimin e gjuhës R në zgjidhjen e detyrave të përditshme.
Burimi: habr.com
