Werk met datums in R (basiese vermoëns, sowel as die smeer- en tydperiodesR-pakkette)

Kry die huidige datum in enige programmeertaal, 'n operasie gelykstaande aan "Hallo wêreld!" Die R-taal is geen uitsondering nie.

In hierdie artikel sal ons kyk hoe werk met datums werk in die basiese sintaksis van die R-taal, en ook kyk na verskeie nuttige pakkette wat sy vermoëns uitbrei wanneer met datums gewerk word:

  • lubridate — 'n pakket wat jou toelaat om rekenkundige berekeninge tussen datums uit te voer;
  • timeperiodsR — 'n pakket om met tydintervalle en hul komponente te werk.

Werk met datums in R (basiese vermoëns, sowel as die smeer- en tydperiodesR-pakkette)

inhoud

As jy belangstel in data-analise, en veral die R-taal, sal jy dalk belangstel in my telegram и YouTube kanale. Die meeste van die inhoud daarvan word aan die R-taal gewy.

  1. Werk met datums in basiese R-sintaksis
    1.1. Skakel teks om na datum
    1.2. Onttrek datumkomponente in basiese R
  2. Werk met datums deur die smeerpakket te gebruik
    2.1. Skakel teks om na datum met smeermiddel
    2.2. Onttrek datumkomponente deur die smeerpakket te gebruik
    2.3. Rekenkundige bewerkings met datums
  3. Vereenvoudigde werk met periodes, tydperiodesR-pakket
    3.1. Tydintervalle in tydperkeR
    3.2. Filtreer 'n vektor van datums deur tydperiodesR te gebruik
  4. Gevolgtrekking

Werk met datums in basiese R-sintaksis

Skakel teks om na datum

Basiese R het 'n stel funksies om met datums te werk. Die nadeel van die basiese sintaksis is dat die geval van funksiename en argumente baie verspreid is en feitlik geen logiese verband het nie. Jy moet egter die basiese funksies van die taal ken, daarom sal ons daarmee begin.

Meestal ontvang jy 'n datum as teks wanneer jy data in R laai, vanaf csv-lêers of ander bronne. Om hierdie teks na die korrekte datatipe om te skakel, gebruik die funksie 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 verstek as.Date() aanvaar datum in twee formate: JJJJ-MM-DD of JJJJ/MM/DD.
As jou datastel datums in 'n ander formaat bevat, kan jy die argument gebruik format.

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

formaat aanvaar operateurs in stringvorm wat enige tydinterval en sy formaat aandui; die mees gebruikte waardes word in die tabel hieronder getoon:

formaat
Beskrywing

%d
Dagnommer in maand

%a
Afkorting vir die naam van die dag van die week

%A
Volle naam van die dag van die week

%w
Nommer van die dag van die week (0-6, waar 0 Sondag is)

%m
Tweesyfer-maandbenaming (01-12)

%b
Afkorting van maandnaam (apr, mrt, …)

%B
Volle maand naam

%y
Twee-syfer jaaraanduiding

%Y
Viersyfer-jaaraanduiding

%j
Dagnommer in die jaar (001 - 366)

%U
Getal van die week in die jaar (00 - 53), begin van die week Sondag

%W
Weeknommer in die jaar (00 - 53), begin van die week Maandag

Gevolglik is "26 September 2019" die volle naam van die maand, datum en jaar. Hierdie datumformaat kan soos volg beskryf word deur operateurs te gebruik:"%B %d, %Y".

Waar:

  • %B — Volle naam van die maand
  • %d — Nommer van die dag in die maand
  • %Y — Viersyfer-jaaraanduiding

Wanneer jy die datumformaat beskryf, is dit belangrik om alle bykomende karakters van jou string in te sluit, soos strepies, kommas, punte, spasies, ensovoorts. In my voorbeeld, "26 September 2019", is daar 'n komma na die datum, en jy moet ook 'n komma in die formaatbeskrywing plaas:"%B %d, %Y".

Daar is situasies wanneer jy 'n datum ontvang wat nie net nie ooreenstem met standaardformate nie (JJJJ-MM-DD of JJJJ/MM/DD), maar ook in 'n taal wat verskil van die verstek een wat op jou bedryfstelsel geïnstalleer is. Jy het byvoorbeeld data afgelaai waar die datum soos volg aangedui word: "15 Desember 2019." Voordat jy hierdie string na 'n datum omskakel, moet jy die locale verander.

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

Onttrek datumkomponente in basiese R

Daar is nie baie funksies in basiese R wat jou toelaat om enige deel van 'n datum uit 'n klasvoorwerp te onttrek nie datum.

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

Benewens die hoofobjekklas datum in basiese R is daar nog 2 datatipes wat 'n tydstempel stoor: POSIXlt, POSIXct. Die belangrikste verskil tussen hierdie klasse en datum is dat bykomend tot die datum wat hulle tyd stoor.

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

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

# "POSIXct" "POSIXt"

Funksie Sys.time() gee die huidige datum en tyd in die formaat terug POSIXct. Hierdie formaat is soortgelyk in betekenis aan UNIXTIME, en stoor die aantal sekondes sedert die begin van die UNIX-era (middernag (UTC) vanaf 31 Desember 1969 tot 1 Januarie 1970).

Klas POSIXlt dit stoor ook die tyd en datum, en al hul komponente. Daarom is dit 'n voorwerp met 'n meer komplekse struktuur, maar waaruit dit maklik is om enige datum- en tydkomponent te verkry omdat in werklikheid POSIXlt hierdie lys.

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

Omskakeling van numeriese en teksdata na formate POSIX* deur funksies uitgevoer word as.POSIXct() и as.POSIXlt(). Hierdie funksies het 'n klein stel argumente.

  • x — Getal, string of klasvoorwerp datum, wat omgeskakel moet word;
  • tz — Tydsone, verstek "GMT";
  • formaat — Beskrywing van die datumformaat waarin die data wat na die x-argument oorgedra is, verteenwoordig word;
  • oorsprong — Word slegs gebruik wanneer 'n getal na POSIX omgeskakel word; jy moet 'n datumvoorwerp en tyd vanwaar die sekondes in hierdie argument getel word, deurgee. Tipies gebruik vir vertaling vanaf UNIXTIME.

As jou datum en tyd inligting in is UNIXTIME, gebruik dan die volgende voorbeeld om dit in 'n duidelike, leesbare datum om te skakel:

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

In oorsprong kan jy enige tydstempel spesifiseer. Byvoorbeeld, as jou data die datum en tyd bevat as die aantal sekondes sedert 15 September 2019 12:15, gebruik dan om dit na 'n datum om te skakel:

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

Werk met datums deur die smeerpakket te gebruik

lubridate Miskien die gewildste pakket om met datums in die R-taal te werk. Dit bied jou drie bykomende klasse.

  • duurs — duur, d.w.s. aantal sekondes tussen twee tydstempels;
  • periodes - periodes laat jou toe om berekeninge te maak tussen datums in mens-leesbare intervalle: dae, maande, weke, ensovoorts;
  • intervalle - voorwerpe wat die begin- en eindpunt in tyd verskaf.

Installasie van bykomende pakkette in die R-taal word uitgevoer met behulp van die standaardfunksie install.packages().

Installeer die pakket lubridate:

install.packages("lubridate")

Skakel teks om na datum met smeermiddel

Pakketkenmerke lubridate vereenvoudig die proses om teks in 'n datum om te skakel aansienlik, en laat jou ook toe om enige rekenkundige bewerkings met datums en tye uit te voer.

Die funksies sal jou help om die huidige datum of datum en tyd te kry today() и now().

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

Om 'n string om te skakel na 'n datum in lubridate Daar is 'n hele familie van funksies waarvan die name altyd uit drie letters bestaan, en die volgorde van datumkomponente aandui:

  • y - jaar
  • m - maand
  • d - dag

Lys van funksies vir die omskakeling van teks na datum via lubridate

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

Enkele voorbeelde vir die omskakeling van stringe na datums:

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

Soos jy kan sien lubridate Dit is baie meer doeltreffend om datumbeskrywings as teks te herken, en laat jou toe om teks na datum om te skakel sonder om bykomende operateurs te gebruik om die formaat te beskryf.

Onttrek datumkomponente deur die smeerpakket te gebruik

Gebruik ook lubridate jy kan enige komponent vanaf 'n datum kry:

dt <- ymd("2017 jan 21")

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

Rekenkundige bewerkings met datums

Maar die belangrikste en basiese funksionaliteit lubridate is die vermoë om verskeie rekenkundige bewerkings met datums uit te voer.

Datum afronding word uitgevoer deur drie funksies:

  • floor_date — afronding tot die naaste verlede tyd
  • ceiling_date — afronding tot die nabye toekomstyd
  • round_date - afronding tot die naaste tyd

Elkeen van hierdie funksies het 'n argument eenheidwat jou toelaat om die afrondingseenheid te spesifiseer: sekonde, minuut, uur, dag, week, maand, tweemaand, kwartaal, seisoen, halfjaar, jaar

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

Laat ons dus uitvind hoe om 'n datum te kry wat 8 dae na die huidige datum is en verskeie ander rekenkundige berekeninge tussen die twee datums doen.

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

Vereenvoudigde werk met periodes, tydperiodesR-pakket.

timeperiodsR — 'n vars pakket om met datums te werk wat in September 2019 op CRAN gepubliseer is.

Installeer die pakket timeperiodsR:

install.packages("timeperiodsR")

Die hoofdoel is om vinnig 'n sekere tydinterval relatief tot 'n gegewe datum te bepaal. As u byvoorbeeld die funksies daarvan gebruik, kan u maklik:

  • Kry die afgelope week, maand, kwartaal of jaar in R.
  • Kry 'n gespesifiseerde aantal tydintervalle relatief tot 'n datum, byvoorbeeld die afgelope 4 weke.
  • Dit is maklik om die komponente daarvan uit die resulterende tydinterval te onttrek: die begin- en einddatum, die aantal dae wat by die interval ingesluit is, die hele volgorde van datums wat daarin ingesluit is.

Naam van alle pakketfunksies timeperiodsR is intuïtief en bestaan ​​uit twee dele: rigting_intervalwaar:

  • rigting waarin jy relatief tot 'n gegewe datum moet beweeg: laaste_n, vorige, hierdie, volgende, volgende_n.
  • tydelike interval om die tydperk te bereken: dag, week, maand, kwartaal, jaar.

Volledige stel funksies:

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

Tydintervalle in tydperkeR

Hierdie funksies is nuttig in gevalle waar jy verslae moet bou gebaseer op data van die afgelope week of maand. Om die laaste maand te kry, gebruik die funksie met dieselfde naam previous_month():

prmonth <- previous_month()

Daarna sal jy 'n voorwerp hê prmaand klas TPR, waaruit die volgende komponente maklik verkry kan word:

  • die begindatum van die tydperk, in ons voorbeeld is dit die laaste maand
  • tydperk einddatum
  • aantal dae ingesluit in die tydperk
  • volgorde van datums wat by die tydperk ingesluit is

Boonop kan u elk van die komponente op verskillende maniere verkry:

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

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

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

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

Jy kan ook enige van die komponente kry deur die argument te gebruik deel, wat in elk van die pakketfunksies teenwoordig is. Moontlike waardes: begin, einde, volgorde, lengte.

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

Kom ons kyk dus na al die argumente wat in die pakketfunksies beskikbaar is timeperiodsR:

  • x — Die verwysingsdatum vanwaar die tydperk bereken sal word, die huidige datum by verstek;
  • n — Die aantal intervalle wat by die tydperk ingesluit sal word, byvoorbeeld die vorige 3 weke;
  • part — Watter komponent van die voorwerp tpr jy moet by verstek kry all;
  • week_start — Die argument is slegs teenwoordig in funksies om met weke te werk, en laat jou toe om die nommer van die dag van die week te stel wat as die begin daarvan beskou sal word. By verstek is die begin van die week Maandag, maar jy kan enige van 1 - Maandag tot 7 - Sondag.

U kan dus enige tydperk relatief tot die huidige of enige ander gegewe datum bereken; hier is nog 'n paar voorbeelde:

# получить 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 Sondag:
Werk met datums in R (basiese vermoëns, sowel as die smeer- en tydperiodesR-pakkette)

Ons benodig 'n tydperk wat, relatief tot 6 Oktober, die vorige 3 weke sal neem. Nie die week wat 6 Oktober self insluit nie. Gevolglik is dit die tydperk van 9 September tot 29 September.

Werk met datums in R (basiese vermoëns, sowel as die smeer- en tydperiodesR-pakkette)

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

In hierdie voorbeeld stel ons belang in die maand wat 4 maande gelede was, as ons vanaf 16 September 2019 begin, dan was dit Mei 2019.

Filtreer 'n vektor van datums deur tydperiodesR te gebruik

Om datums in te filter timeperiodsR Daar is verskeie operateurs:

  • %left_out% - vergelyk twee tpr-klasobjekte, en gee die waarde van die linker een terug wat in die regter een ontbreek.
  • %left_in% - vergelyk twee voorwerpe van die tpr-klas, en gee die datums van die linker voorwerp terug wat by die regter een ingesluit is.
  • %right_out% - vergelyk twee tpr-klasobjekte, en gee die waarde van die regter een wat ontbreek van die linker een terug.
  • %right_in% - vergelyk twee voorwerpe van die tpr-klas, en gee datums van die regter voorwerp terug wat in die linker een voorkom.

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 die pakkie timeperiodsR daar is 'n amptelike, Russiestalige een YouTube-snitlys.

Gevolgtrekking

Ons het die klasse voorwerpe wat in die R-taal ontwerp is om met datums te werk, in detail ondersoek. Ook nou kan jy rekenkundige bewerkings op datums uitvoer, en vinnig enige tydperke met die pakket verkry timeperiodsR.

As jy belangstel in die R-taal, nooi ek jou uit om op my telegramkanaal in te teken R4 bemarking, waarin ek daagliks nuttige materiaal deel oor die gebruik van die R-taal om jou daaglikse probleme op te los.

Bron: will.com

Voeg 'n opmerking