Arbeide med datoer i R (grunnleggende funksjoner, samt smøre- og tidsperioderR-pakkene)

Få gjeldende dato på et hvilket som helst programmeringsspråk, en operasjon som tilsvarer "Hallo verden!" R-språket er intet unntak.

I denne artikkelen skal vi se på hvordan arbeid med datoer fungerer i den grunnleggende syntaksen til R-språket, og også se på flere nyttige pakker som utvider mulighetene når du arbeider med datoer:

  • lubridate — en pakke som lar deg utføre aritmetiske beregninger mellom datoer;
  • timeperiodsR — en pakke for arbeid med tidsintervaller og deres komponenter.

Arbeide med datoer i R (grunnleggende funksjoner, samt smøre- og tidsperioderR-pakkene)

Innhold

Hvis du er interessert i dataanalyse, og spesielt R-språket, kan du være interessert i min telegram и youtube kanaler. Det meste av innholdet er dedikert til R-språket.

  1. Arbeide med datoer i grunnleggende R-syntaks
    1.1. Konverter tekst til dato
    1.2. Trekk ut datokomponenter i grunnleggende R
  2. Arbeid med dadler ved hjelp av smørepakken
    2.1. Konverter tekst til dato ved å bruke lubridate
    2.2. Trekk ut datokomponenter ved hjelp av smørepakken
    2.3. Aritmetiske operasjoner med datoer
  3. Forenklet arbeid med perioder, tidsperioderR-pakke
    3.1. Tidsintervaller i tidsperioderR
    3.2. Filtrering av en vektor av datoer ved hjelp av tidsperioderR
  4. Konklusjon

Arbeide med datoer i grunnleggende R-syntaks

Konverter tekst til dato

Basic R har et sett med funksjoner for arbeid med datoer. Ulempen med den grunnleggende syntaksen er at tilfellet med funksjonsnavn og argumenter er svært spredt og har praktisk talt ingen logisk sammenheng. Du må imidlertid kjenne til de grunnleggende funksjonene til språket, så vi starter med dem.

Oftest når du laster data inn i R, fra csv-filer eller andre kilder, mottar du en dato som tekst. For å konvertere denne teksten til riktig datatype, bruk funksjonen 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"

Som standard as.Date() godtar dato i to formater: ÅÅÅÅ-MM-DD eller ÅÅÅÅ/MM/DD.
Hvis datasettet ditt inneholder datoer i et annet format, kan du bruke argumentet format.

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

format aksepterer operatører i strengform som angir ethvert tidsintervall og dets format; de mest brukte verdiene er vist i tabellen nedenfor:

Format
beskrivelse

%d
Dagnummer i måned

%a
Forkortelse for navnet på ukedagen

%A
Fullt navn på ukedagen

%w
Nummer på ukedagen (0-6, hvor 0 er søndag)

%m
Tosifret månedsbetegnelse (01-12)

%b
Forkortelse av månedsnavn (apr, mar, …)

%B
Full måneds navn

%y
Tosifret årsbetegnelse

%Y
Firesifret årsbetegnelse

%j
Dagnummer i året (001 - 366)

%U
Ukens nummer i året (00 - 53), begynnelsen av uken søndag

%W
Ukenummer i året (00 - 53), begynnelsen av uken mandag

Følgelig er "26. september 2019" det fulle navnet på måneden, datoen og året. Dette datoformatet kan beskrives ved å bruke operatører som følger:"%B %d, %Y".

Hvor:

  • %B — Månedens fulle navn
  • %d — Dagens nummer i måneden
  • %Y — Firesifret årsbetegnelse

Når du beskriver datoformatet, er det viktig å inkludere alle tilleggstegn fra strengen din, for eksempel bindestreker, kommaer, punktum, mellomrom og så videre. I mitt eksempel, "26. september 2019", er det et komma etter datoen, og du må også sette et komma i formatbeskrivelsen:"%B %d, %Y".

Det er situasjoner når du mottar en dato som ikke bare ikke samsvarer med standardformater (ÅÅÅÅ-MM-DD eller ÅÅÅÅ/MM/DD), men også på et språk som er forskjellig fra standardspråket som er installert på operativsystemet ditt. For eksempel lastet du ned data der datoen er angitt slik: «15. desember 2019». Før du konverterer denne strengen til en dato, må du endre lokaliteten.

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

Trekk ut datokomponenter i grunnleggende R

Det er ikke mange funksjoner i grunnleggende R som lar deg trekke ut hvilken som helst del av en dato fra et klasseobjekt Dato.

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

I tillegg til hovedobjektklassen Dato i basic R er det 2 flere datatyper som lagrer et tidsstempel: POSIXlt, POSIXct. Hovedforskjellen mellom disse klassene og Dato er at i tillegg til datoen de lagrer tid.

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

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

# "POSIXct" "POSIXt"

Funksjon Sys.time() returnerer gjeldende dato og klokkeslett i formatet POSIXct. Dette formatet ligner i betydningen UNIXTIME, og lagrer antall sekunder siden begynnelsen av UNIX-æraen (midnatt (UTC) fra 31. desember 1969 til 1. januar 1970).

Klasse POSIXlt den lagrer også klokkeslett og dato, og alle komponentene deres. Derfor er det et objekt med en mer kompleks struktur, men som det er lett å få en hvilken som helst dato- og tidskomponent fra fordi faktisk POSIXlt dette liste.

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

Konvertering av numeriske og tekstdata til formater POSIX* utføres av funksjoner as.POSIXct() и as.POSIXlt(). Disse funksjonene har et lite sett med argumenter.

  • x — Tall, streng eller klasseobjekt Dato, som må konverteres;
  • tz — Tidssone, standard "GMT";
  • format — Beskrivelse av datoformatet som dataene som sendes til x-argumentet er representert i;
  • opprinnelse — Brukes bare når du konverterer et tall til POSIX; du må sende et datoobjekt og klokkeslett som sekundene telles fra til dette argumentet. Brukes vanligvis for oversettelse fra UNIXTIME.

Hvis dato- og klokkeslettinformasjonen din er inne UNIXTIME, for å konvertere dem til en tydelig, lesbar dato, bruk følgende eksempel:

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

I opprinnelse kan du spesifisere et hvilket som helst tidsstempel. For eksempel, hvis dataene dine inneholder dato og klokkeslett som antall sekunder siden 15. september 2019 kl. 12:15, så bruk for å konvertere dem til en dato:

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

Arbeid med dadler ved hjelp av smørepakken

lubridate Kanskje den mest populære pakken for å jobbe med datoer på språket R. Den gir deg tre ekstra klasser.

  • varigheter — varighet, dvs. antall sekunder mellom to tidsstempler;
  • perioder - perioder lar deg foreta beregninger mellom datoer i menneskelig lesbare intervaller: dager, måneder, uker og så videre;
  • intervaller - objekter som gir start- og sluttpunkt i tid.

Installasjon av tilleggspakker på R-språket utføres ved hjelp av standardfunksjonen install.packages().

Installerer pakken lubridate:

install.packages("lubridate")

Konverter tekst til dato ved å bruke lubridate

Pakkefunksjoner lubridate betydelig forenkle prosessen med å konvertere tekst til en dato, og lar deg også utføre alle aritmetiske operasjoner med datoer og klokkeslett.

Funksjonene vil hjelpe deg å få gjeldende dato eller dato og klokkeslett today() и now().

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

For å konvertere en streng til en dato i lubridate Det er en hel familie av funksjoner hvis navn alltid består av tre bokstaver, og indikerer sekvensen av datokomponenter:

  • y - år
  • m - måned
  • d - dag

Liste over funksjoner for å konvertere tekst til dato via lubridate

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

Noen eksempler for konvertering av strenger til datoer:

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

Som du kan se lubridate Den er mye mer effektiv til å gjenkjenne datobeskrivelser som tekst, og lar deg konvertere tekst til dato uten å bruke flere operatorer for å beskrive formatet.

Trekk ut datokomponenter ved hjelp av smørepakken

Bruker også lubridate du kan få hvilken som helst komponent fra en dato:

dt <- ymd("2017 jan 21")

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

Aritmetiske operasjoner med datoer

Men den viktigste og grunnleggende funksjonaliteten lubridate er evnen til å utføre ulike aritmetiske operasjoner med datoer.

Datoavrunding utføres av tre funksjoner:

  • floor_date — avrunding til nærmeste preteritum
  • ceiling_date — avrunding til nær fremtid
  • round_date - avrunding til nærmeste tidspunkt

Hver av disse funksjonene har et argument enhetsom lar deg spesifisere avrundingsenheten: sekund, minutt, time, dag, uke, måned, annenhver måned, kvartal, sesong, halvår, år

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

Så la oss finne ut hvordan du får en dato som er 8 dager etter gjeldende dato og gjør forskjellige andre aritmetiske beregninger mellom de to datoene.

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

Forenklet arbeid med perioder, tidsperioderR-pakke.

timeperiodsR — en fersk pakke for arbeid med datoer som ble publisert på CRAN i september 2019.

Installerer pakken timeperiodsR:

install.packages("timeperiodsR")

Hovedformålet er å raskt bestemme et visst tidsintervall i forhold til en gitt dato. Ved å bruke funksjonene kan du for eksempel enkelt:

  • Få siste uke, måned, kvartal eller år i R.
  • Få et spesifisert antall tidsintervaller i forhold til en dato, for eksempel de siste 4 ukene.
  • Det er enkelt å trekke ut komponentene fra det resulterende tidsintervallet: start- og sluttdatoen, antall dager inkludert i intervallet, hele sekvensen av datoer som er inkludert i det.

Navn på alle pakkefunksjoner timeperiodsR er intuitive og består av to deler: retning_intervall, hvor:

  • retning der du må flytte i forhold til en gitt dato: siste_n, forrige, denne, neste, neste_n.
  • tidsmessig intervall for å beregne perioden: dag, uke, måned, kvartal, år.

Fullt sett med funksjoner:

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

Tidsintervaller i tidsperioderR

Disse funksjonene er nyttige i tilfeller der du trenger å bygge rapporter basert på data fra siste uke eller måned. For å få den siste måneden, bruk funksjonen med samme navn previous_month():

prmonth <- previous_month()

Deretter vil du ha et objekt pr måned klasse TPR, hvorfra følgende komponenter lett kan skaffes:

  • startdatoen for perioden, i vårt eksempel er dette den siste måneden
  • periodens sluttdato
  • antall dager inkludert i perioden
  • rekkefølge av datoer inkludert i perioden

Dessuten kan du få tak i hver av komponentene på forskjellige måter:

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

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

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

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

Du kan også få noen av komponentene ved å bruke argumentet del, som er til stede i hver av pakkefunksjonene. Mulige verdier: start, slutt, sekvens, lengde.

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

Så la oss se på alle argumentene som er tilgjengelige i pakkefunksjonene timeperiodsR:

  • x — Referansedatoen som tidsperioden vil bli beregnet fra, gjeldende dato som standard;
  • n — Antall intervaller som skal inkluderes i perioden, for eksempel de foregående 3 ukene;
  • part — Hvilken komponent av objektet tpr du må få, som standard all;
  • week_start — Argumentet finnes kun i funksjoner for å arbeide med uker, og lar deg sette nummeret på ukedagen som skal anses som begynnelsen. Som standard er ukens start mandag, men du kan sette hvilken som helst fra kl. 1 - mandag til 7 - søndag.

Dermed kan du beregne en hvilken som helst tidsperiode i forhold til gjeldende eller en hvilken som helst annen gitt dato; her er noen flere eksempler:

# получить 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 er søndag:
Arbeide med datoer i R (grunnleggende funksjoner, samt smøre- og tidsperioderR-pakkene)

Vi trenger en periode som i forhold til 6. oktober vil ta de foregående 3 ukene. Ikke inkludert uken som inkluderer selve 6. oktober. Følgelig er dette perioden fra 9. september til 29. september.

Arbeide med datoer i R (grunnleggende funksjoner, samt smøre- og tidsperioderR-pakkene)

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

I dette eksemplet er vi interessert i måneden som var 4 måneder siden, hvis vi starter fra 16. september 2019, så var det mai 2019.

Filtrering av en vektor av datoer ved hjelp av tidsperioderR

For å filtrere datoer inn timeperiodsR Det er flere operatører:

  • %left_out% - sammenligner to tpr-klasseobjekter, og returnerer verdien fra den venstre som mangler i den høyre.
  • %left_in% - sammenligner to objekter av tpr-klassen, og returnerer datoene fra det venstre objektet som er inkludert i det høyre.
  • %right_out% - sammenligner to tpr-klasseobjekter, og returnerer verdien fra den høyre som mangler fra den venstre.
  • %right_in% - sammenligner to objekter av tpr-klassen, og returnerer datoer fra det høyre objektet som er tilstede i det venstre.

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

Ved pakken timeperiodsR det er en offisiell, russiskspråklig YouTube-spilleliste.

Konklusjon

Vi undersøkte i detalj klassene av objekter som er designet på R-språket for arbeid med datoer. Også nå kan du utføre aritmetiske operasjoner på datoer, og raskt få alle tidsperioder ved å bruke pakken timeperiodsR.

Hvis du er interessert i R-språket, inviterer jeg deg til å abonnere på telegramkanalen min R4markedsføring, der jeg daglig deler nyttig materiale om bruk av R-språket for å løse dine daglige problemer.

Kilde: www.habr.com

Legg til en kommentar