Wurkje mei datums yn R (basismooglikheden, lykas de smeer- en tiidperioadenR-pakketten)

Krij de aktuele datum yn elke programmeartaal, in operaasje lykweardich oan "Hallo wrâld!" De R-taal is gjin útsûndering.

Yn dit artikel sille wy sjen hoe't wurkje mei datums wurket yn 'e basissyntaksis fan' e R-taal, en ek sjogge nei ferskate nuttige pakketten dy't har mooglikheden útwreidzje by it wurkjen mei datums:

  • lubridate - in pakket wêrmei jo arithmetyske berekkeningen kinne útfiere tusken datums;
  • timeperiodsR - in pakket foar it wurkjen mei tiidintervallen en har komponinten.

Wurkje mei datums yn R (basismooglikheden, lykas de smeer- en tiidperioadenR-pakketten)

Ynhâld

As jo ​​ynteressearre binne yn gegevens analyze, en benammen de R taal, Jo kinne v're ynteressearre yn myn telegram и youtube kanalen. It grutste part fan de ynhâld is wijd oan de R-taal.

  1. Wurkje mei datums yn basis R-syntaksis
    1.1. Konvertearje tekst nei datum
    1.2. Datumkomponinten ekstrahearje yn basis R
  2. Wurkje mei datums mei it lubridatepakket
    2.1. Konvertearje tekst nei datum mei lubridate
    2.2. Extracting date komponinten mei help fan de lubridate pakket
    2.3. Aritmetyske operaasjes mei datums
  3. Simplified wurk mei perioaden, timeperiodsR pakket
    3.1. Tiid yntervallen yn timeperiodsR
    3.2. In fektor fan datums filterje mei timeperiodsR
  4. konklúzje

Wurkje mei datums yn basis R-syntaksis

Konvertearje tekst nei datum

Basic R hat in set fan funksjes foar it wurkjen mei datums. It neidiel fan de basissyntaksis is dat it gefal fan funksjenammen en arguminten tige ferspraat is en praktysk gjin logyske ferbining hat. Jo moatte lykwols de basisfunksjes fan 'e taal witte, dus wy sille mei har begjinne.

Meastentiids by it laden fan gegevens yn R, fan csv-bestannen, of oare boarnen, krije jo in datum as tekst. Om dizze tekst te konvertearjen nei it juste gegevenstype, brûk de funksje 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"

standert as.Date() akseptearret datum yn twa formaten: JJJJ-MM-DD of JJJJ/MM/DD.
As jo ​​gegevensset datums yn in oar formaat befettet, kinne jo it argumint brûke format.

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

opmaak akseptearret operators yn tekenrige foarm dy't elk tiidynterval en har opmaak oanjaan; de meast brûkte wearden wurde werjûn yn 'e tabel hjirûnder:

Format
beskriuwing

%d
Dagnûmer yn moanne

%a
Ofkoarting foar de namme fan de dei fan de wike

%A
Folsleine namme fan de dei fan de wike

%w
Nûmer fan de dei fan 'e wike (0-6, wêrby't 0 snein is)

%m
Twa-sifers moanne oantsjutting (01-12)

%b
Ofkoarting fan moannenamme (apr, mrt, ...)

%B
Folsleine moanne namme

%y
Twa-sifers jier oantsjutting

%Y
Fjouwer-sifers jier oantsjutting

%j
Dagnûmer yn it jier (001 - 366)

%U
Nûmer fan 'e wike yn it jier (00 - 53), begjin fan' e wike snein

%W
Weeknûmer yn it jier (00 - 53), begjin fan 'e wike moandei

Dêrtroch is "26 septimber 2019" de folsleine namme fan 'e moanne, datum en jier. Dit datumformaat kin wurde beskreaun mei operators as folget:"%B %d, %Y".

Wêr:

  • %B - Folsleine namme fan 'e moanne
  • %d - Nûmer fan de dei yn 'e moanne
  • %Y - Fjouwer-sifers jier oantsjutting

By it beskriuwen fan it datumformaat is it wichtich om alle ekstra tekens fan jo tekenrige op te nimmen, lykas streepkes, komma's, perioaden, spaasjes, ensfh. Yn myn foarbyld, "26 septimber 2019", is d'r in komma nei de datum, en jo moatte ek in komma sette yn 'e opmaakbeskriuwing:"%B %d, %Y".

D'r binne situaasjes as jo in datum krije dy't net allinich net oerienkomt mei standertformaten (JJJJ-MM-DD of JJJJ/MM/DD), mar ek yn in taal dy't ôfwykt fan de standert dy't ynstallearre is op jo bestjoeringssysteem. Jo hawwe bygelyks gegevens downloade wêr't de datum sa wurdt oanjûn: "15 desimber 2019." Foardat jo dizze tekenrige nei in datum konvertearje, moatte jo de lokaasje feroarje.

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

Datumkomponinten ekstrahearje yn basis R

D'r binne net in protte funksjes yn basis R wêrmei jo elk diel fan in datum út in klasseobjekt kinne ekstrahearje Datum.

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

Neist de wichtichste foarwerp klasse Datum yn basis R binne d'r 2 mear gegevenstypen dy't in tiidstempel opslaan: POSIXlt, POSIXct. It wichtichste ferskil tusken dizze klassen en Datum is dat neist de datum se bewarje tiid.

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

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

# "POSIXct" "POSIXt"

function Sys.time() jout de aktuele datum en tiid werom yn it formaat POSIXct. Dit formaat is fergelykber yn betsjutting oan UNIXTIME, en bewarret it oantal sekonden sûnt it begjin fan it UNIX-tiidrek (middernacht (UTC) fan 31 desimber 1969 oant 1 jannewaris 1970).

Klasse POSIXlt it bewarret ek de tiid en datum, en al har komponinten. Dêrom is it in objekt mei in kompleksere struktuer, mar wêrfan it maklik is om elke datum- en tiidkomponint te krijen, om't yn feite 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  # часовой пояс

It konvertearjen fan numerike en tekstgegevens nei formaten POSIX* útfierd troch funksjes as.POSIXct() и as.POSIXlt(). Dizze funksjes hawwe in lytse set arguminten.

  • x - Getal, tekenrige of klasseobjekt Datum, dy't omset wurde moat;
  • tz - Tiidsône, standert "GMT";
  • opmaak - Beskriuwing fan it datumformaat wêryn de gegevens trochjûn oan it x-argumint fertsjintwurdige binne;
  • oarsprong - Wurdt allinich brûkt by it konvertearjen fan in nûmer nei POSIX; jo moatte in datumobjekt en tiid trochjaan wêrfan de sekonden wurde teld nei dit argumint. Typysk brûkt foar oersetting fan UNIXTIME.

As jo ​​datum en tiid ynformaasje is yn UNIXTIME, brûk dan it folgjende foarbyld om se te konvertearjen yn in dúdlike, lêsbere datum:

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

Yn oarsprong kinne jo elke tiidstempel opjaan. Bygelyks, as jo gegevens de datum en tiid befetsje as it oantal sekonden sûnt septimber 15, 2019 12:15 pm, dan om it te konvertearjen nei in datum brûke:

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

Wurkje mei datums mei it lubridatepakket

lubridate Miskien wol it populêrste pakket foar it wurkjen mei datums yn de taal R. It jout jo trije ekstra klassen.

  • durations - duration, d.w.s. oantal sekonden tusken twa tiidstempels;
  • perioaden - perioaden kinne jo berekkeningen meitsje tusken datums yn troch minsken lêsbere yntervallen: dagen, moannen, wiken, ensfh.
  • yntervallen - objekten dy't it begjin- en einpunt yn 'e tiid leverje.

Ynstallaasje fan ekstra pakketten yn 'e R-taal wurdt útfierd mei de standertfunksje install.packages().

It ynstallearjen fan it pakket lubridate:

install.packages("lubridate")

Konvertearje tekst nei datum mei lubridate

Pakket funksjes lubridate it proses fan it konvertearjen fan tekst yn in datum signifikant ferienfâldigje, en kinne jo ek alle rekenkundige operaasjes útfiere mei datums en tiden.

De funksjes sille jo helpe om de hjoeddeistige datum as datum en tiid te krijen today() и now().

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

Om in tekenrige te konvertearjen nei in datum yn lubridate Der is in hiele famylje fan funksjes waans nammen altyd bestean út trije letters, en jouwe de folchoarder fan datum komponinten:

  • y jier
  • m - moanne
  • d - dei

List mei funksjes foar it konvertearjen fan tekst nei datum fia lubridate

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

Guon foarbylden foar it konvertearjen fan stringen nei datums:

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

Sa't jo sjen kinne lubridate It is folle effisjinter om datumbeskriuwingen as tekst te herkennen, en lit jo tekst konvertearje nei datum sûnder ekstra operators te brûken om it formaat te beskriuwen.

Extracting date komponinten mei help fan de lubridate pakket

Ek brûke lubridate jo kinne elke komponint krije fan in datum:

dt <- ymd("2017 jan 21")

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

Aritmetyske operaasjes mei datums

Mar de wichtichste en basale funksjonaliteit lubridate is de mooglikheid om ferskate aritmetyske operaasjes út te fieren mei datums.

Datum ôfrûning wurdt útfierd troch trije funksjes:

  • floor_date - ôfrûning nei de tichtste doetiid
  • ceiling_date - ôfrûning nei de takomstige tiid
  • round_date - ôfrûning op de tichtstbye tiid

Elk fan dizze funksjes hat in argumint ienheidwêrmei jo de ôfrondende ienheid kinne opjaan: twadde, minút, oere, dei, wike, moanne, twamoanne, kwart, seizoen, healjier, jier

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

Dat litte wy útfine hoe't jo in datum krije dy't 8 dagen nei de aktuele datum is en ferskate oare arithmetyske berekkeningen dwaan tusken de twa datums.

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

Simplified wurk mei perioaden, timeperiodsR pakket.

timeperiodsR - in nij pakket foar wurkjen mei datums dat waard publisearre op CRAN yn septimber 2019.

It ynstallearjen fan it pakket timeperiodsR:

install.packages("timeperiodsR")

It haaddoel is om fluch in bepaald tiidynterval relatyf oan in opjûne datum te bepalen. Bygelyks, mei help fan syn funksjes kinne jo maklik:

  • Krij de ôfrûne wike, moanne, kwartaal as jier yn R.
  • Krij in spesifisearre oantal tiidintervallen relatyf oan in datum, bygelyks de ôfrûne 4 wiken.
  • It is maklik om de komponinten út it resultearjende tiidynterval te ekstrahearjen: de start- en eindatum, it oantal dagen opnommen yn it ynterval, de folsleine folchoarder fan datums dy't deryn binne opnaam.

Namme fan alle pakketfunksjes timeperiodsR binne yntuïtyf en besteane út twa dielen: rjochting_tuskenskoft, dêr't:

  • rjochting wêryn jo moatte ferpleatse relatyf oan in opjûne datum: last_n, previous, this, next, next_n.
  • tydlik tuskenskoft om de perioade te berekkenjen: dei, wike, moanne, fearnsjier, jier.

Folsleine set fan funksjes:

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

Tiid yntervallen yn timeperiodsR

Dizze funksjes binne nuttich yn gefallen wêr't jo rapporten moatte bouwe op basis fan gegevens fan 'e ôfrûne wike of moanne. Om de lêste moanne te krijen, brûk de funksje mei deselde namme previous_month():

prmonth <- previous_month()

Dêrnei sille jo in objekt hawwe prmonth klasse tpr, wêrfan de folgjende komponinten maklik te krijen binne:

  • de startdatum fan 'e perioade, yn ús foarbyld is dit de lêste moanne
  • perioade eindatum
  • oantal dagen opnommen yn 'e perioade
  • folchoarder fan datums opnommen yn 'e perioade

Boppedat kinne jo elk fan 'e komponinten op ferskate manieren krije:

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

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

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

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

Jo kinne ek ien fan 'e komponinten krije mei it argumint diel, dy't oanwêzich is yn elk fan 'e pakketfunksjes. Mooglike wearden: begjin, ein, folchoarder, lingte.

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

Litte wy dus sjen nei alle arguminten dy't beskikber binne yn 'e pakketfunksjes timeperiodsR:

  • x - De referinsjedatum wêrfan de tiidperioade wurdt berekkene, de hjoeddeistige datum standert;
  • n - It oantal yntervallen dat yn 'e perioade opnommen wurdt, bygelyks de foargeande 3 wiken;
  • part - Hokker komponint fan it objekt tpr jo moatte krije, standert all;
  • week_start - It argumint is allinich oanwêzich yn funksjes foar it wurkjen mei wiken, en lit jo it nûmer ynstelle fan 'e dei fan' e wike dy't as it begjin beskôge wurdt. Standert is it begjin fan 'e wike moandei, mar jo kinne elk ynstelle fanôf 1 - Moandei oan 7 - Snein.

Sa kinne jo elke tiidperioade relatyf oan 'e aktuele of in oare opjûne datum berekkenje; hjir binne in pear mear foarbylden:

# получить 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 oktober is snein:
Wurkje mei datums yn R (basismooglikheden, lykas de smeer- en tiidperioadenR-pakketten)

Wy hawwe in perioade nedich dy't, relatyf oan 6 oktober, de foargeande 3 wiken duorje sil. Net meirekkene de wike dat omfiemet 6 oktober sels. Dêrtroch is dit de perioade fan 9 septimber oant 29 septimber.

Wurkje mei datums yn R (basismooglikheden, lykas de smeer- en tiidperioadenR-pakketten)

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

Yn dit foarbyld binne wy ​​​​ynteressearre yn 'e moanne dy't 4 moannen lyn wie, as wy begjinne fan 16 septimber 2019, dan wie it maaie 2019.

In fektor fan datums filterje mei timeperiodsR

Om datums yn te filterjen timeperiodsR D'r binne ferskate operators:

  • % left_out% - fergeliket twa tpr klasse foarwerpen, en jout de wearde út de linker ien dy't ûntbrekt yn de rjochter.
  • %left_in% - fergeliket twa objekten fan 'e tpr-klasse, en jout de datums werom fan 'e linker foarwerp dy't opnommen binne yn 'e rjochter.
  • % right_out% - fergeliket twa tpr klasse objekten, en jout de wearde fan 'e rjochter dy't ûntbrekt út' e linker.
  • %right_in% - fergeliket twa objekten fan 'e tpr-klasse, en jout dates fan it rjochterobjekt werom dy't oanwêzich binne yn' e linker.

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

By it pakket timeperiodsR der is in offisjele, Russysktalige YouTube playlist.

konklúzje

Wy ûndersocht yn detail de klassen fan objekten dy't ûntwurpen binne yn 'e R-taal foar wurkjen mei datums. Jo kinne no ek rekenkundige operaasjes útfiere op datums, en fluch elke tiidperioade krije mei it pakket timeperiodsR.

As jo ​​​​ynteressearre binne yn 'e R-taal, noegje ik jo út om te abonnearjen op myn telegramkanaal R4 marketing, wêryn ik op deistige basis brûkbere materialen diel oer it brûken fan de R-taal by it oplossen fan jo deistige problemen.

Boarne: www.habr.com

Add a comment