Arbeta med datum i R (grundläggande funktioner, såväl som paketen för smörjning och tidsperioder)

Få det aktuella datumet på valfritt programmeringsspråk, en operation som motsvarar "Hej världen!" R-språket är inget undantag.

I den här artikeln kommer vi att titta på hur arbete med datum fungerar i den grundläggande syntaxen för R-språket, och även titta på flera användbara paket som utökar dess möjligheter när du arbetar med datum:

  • lubridate — ett paket som låter dig utföra aritmetiska beräkningar mellan datum;
  • timeperiodsR — Ett paket för att arbeta med tidsintervall och deras komponenter.

Arbeta med datum i R (grundläggande funktioner, såväl som paketen för smörjning och tidsperioder)

Innehåll

Om du är intresserad av dataanalys, och i synnerhet R-språket, kan du vara intresserad av min telegram и Youtube kanaler. Det mesta av innehållet är tillägnat R-språket.

  1. Arbeta med datum i grundläggande R-syntax
    1.1. Konvertera text till datum
    1.2. Extrahera datumkomponenter i grundläggande R
  2. Arbeta med datum med hjälp av smörjpaketet
    2.1. Konvertera text till datum med lubridate
    2.2. Extrahera datumkomponenter med hjälp av smörjmedelspaketet
    2.3. Aritmetiska operationer med datum
  3. Förenklat arbete med perioder, tidsperioderR-paket
    3.1. Tidsintervall i tidsperioderR
    3.2. Filtrera en vektor av datum med tidsperioderR
  4. Slutsats

Arbeta med datum i grundläggande R-syntax

Konvertera text till datum

Basic R har en uppsättning funktioner för att arbeta med datum. Nackdelen med den grundläggande syntaxen är att fallet med funktionsnamn och argument är väldigt spretigt och praktiskt taget inte har något logiskt samband. Du behöver dock känna till språkets grundläggande funktioner, så vi börjar med dem.

Oftast när man laddar data till R, från csv-filer eller andra källor får man ett datum som text. För att konvertera denna text till rätt datatyp, använd funktionen 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() accepterar datum i två format: ÅÅÅÅ-MM-DD eller ÅÅÅÅ/MM/DD.
Om din datamängd innehåller datum i något annat format kan du använda argumentet format.

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

format accepterar operatorer i strängform som anger vilket tidsintervall som helst och dess format; de mest använda värdena visas i tabellen nedan:

Format
beskrivning

%d
Dagnummer i månad

%a
Förkortning för namnet på veckodagen

%A
Veckodagens fullständiga namn

%w
Nummer på veckodagen (0-6, där 0 är söndag)

%m
Tvåsiffrig månadsbeteckning (01-12)

%b
Förkortning av månadens namn (apr, mar, …)

%B
Hel månad namn

%y
Tvåsiffrig årsbeteckning

%Y
Fyrsiffrig årsbeteckning

%j
Dagnummer under året (001 - 366)

%U
Veckans nummer på året (00 - 53), veckans början söndag

%W
Veckonummer under året (00 - 53), början av veckan måndag

Följaktligen är "26 september 2019" det fullständiga namnet på månaden, datumet och året. Detta datumformat kan beskrivas med operatorer enligt följande:"%B %d, %Y".

Var:

  • %B — Månadens fullständiga namn
  • %d — Dagens nummer i månaden
  • %Y — Fyrsiffrig årsbeteckning

När du beskriver datumformatet är det viktigt att inkludera alla ytterligare tecken från din sträng, såsom bindestreck, kommatecken, punkter, mellanslag och så vidare. I mitt exempel, "26 september 2019", finns det ett kommatecken efter datumet, och du måste också sätta ett kommatecken i formatbeskrivningen:"%B %d, %Y".

Det finns situationer när du får ett datum som inte bara inte motsvarar standardformaten (ÅÅÅÅ-MM-DD eller ÅÅÅÅ/MM/DD), men också på ett språk som skiljer sig från det standardspråk som är installerat på ditt operativsystem. Till exempel laddade du ner data där datumet anges så här: "15 december 2019." Innan du konverterar den här strängen till ett datum måste du ändra språket.

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

Extrahera datumkomponenter i grundläggande R

Det finns inte många funktioner i basic R som låter dig extrahera någon del av ett datum från ett klassobjekt Datum.

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

Förutom huvudobjektklassen Datum i basic R finns det ytterligare två datatyper som lagrar en tidsstämpel: POSIXlt, POSIXct. Den största skillnaden mellan dessa klasser och Datum är att utöver det datum de lagrar tid.

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

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

# "POSIXct" "POSIXt"

Funktion Sys.time() returnerar aktuellt datum och tid i formatet POSIXct. Detta format liknar innebörden UNIXTIME, och lagrar antalet sekunder sedan början av UNIX-eran (midnatt (UTC) från 31 december 1969 till 1 januari 1970).

Klass POSIXlt den lagrar också tid och datum, och alla deras komponenter. Därför är det ett objekt med en mer komplex struktur, men från vilket det är lätt att få vilken datum- och tidskomponent som helst eftersom faktiskt POSIXlt detta lista.

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

Konvertera numerisk och textdata till format POSIX* utförs av funktioner as.POSIXct() и as.POSIXlt(). Dessa funktioner har en liten uppsättning argument.

  • x — Nummer, sträng eller klassobjekt Datum, som behöver konverteras;
  • tz — Tidszon, standard "GMT";
  • format — Beskrivning av datumformatet i vilket data som skickats till x-argumentet representeras;
  • ursprung — Används endast när du konverterar ett tal till POSIX; du måste skicka ett datumobjekt och en tid från vilken sekunderna räknas till detta argument. Används vanligtvis för översättning från UNIXTIME.

Om din information om datum och tid finns i UNIXTIME, för att sedan omvandla dem till ett tydligt, läsbart datum, använd följande exempel:

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

I ursprung kan du ange vilken tidsstämpel som helst. Om din data till exempel innehåller datum och tid som antalet sekunder sedan 15 september 2019 kl. 12:15, använd då för att konvertera det till ett datum:

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

Arbeta med datum med hjälp av smörjpaketet

lubridate Det kanske mest populära paketet för att arbeta med datum på språket R. Det ger dig ytterligare tre klasser.

  • durations — duration, dvs. antal sekunder mellan två tidsstämplar;
  • perioder - perioder låter dig göra beräkningar mellan datum i läsbara intervall: dagar, månader, veckor och så vidare;
  • intervaller - objekt som ger start- och slutpunkten i tiden.

Installation av ytterligare paket på R-språket utförs med standardfunktionen install.packages().

Installerar paketet lubridate:

install.packages("lubridate")

Konvertera text till datum med lubridate

Paketfunktioner lubridate avsevärt förenkla processen att konvertera text till ett datum, och låter dig även utföra alla aritmetiska operationer med datum och tider.

Funktionerna hjälper dig att få aktuellt datum eller datum och tid today() и now().

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

För att konvertera en sträng till ett datum i lubridate Det finns en hel familj av funktioner vars namn alltid består av tre bokstäver och indikerar sekvensen av datumkomponenter:

  • y - år
  • m - månad
  • D-dagen

Lista över funktioner för att konvertera text till datum via lubridate

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

Några exempel för att konvertera strängar till datum:

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

Som du kan se lubridate Det är mycket effektivare att känna igen datumbeskrivningar som text, och låter dig konvertera text till datum utan att använda ytterligare operatorer för att beskriva formatet.

Extrahera datumkomponenter med hjälp av smörjmedelspaketet

Använder också lubridate du kan få vilken komponent som helst från ett datum:

dt <- ymd("2017 jan 21")

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

Aritmetiska operationer med datum

Men den viktigaste och grundläggande funktionaliteten lubridate är förmågan att utföra olika aritmetiska operationer med datum.

Datumavrundning utförs av tre funktioner:

  • floor_date — avrundning till närmaste dåtid
  • ceiling_date — avrundning till närtid
  • round_date - avrundning till närmaste tidpunkt

Var och en av dessa funktioner har ett argument enhetsom låter dig specificera avrundningsenheten: sekund, minut, timme, dag, vecka, månad, två månader, kvartal, säsong, 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å låt oss ta reda på hur man får ett datum som är 8 dagar efter det aktuella datumet och gör olika andra aritmetiska beräkningar mellan de två datumen.

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

Förenklat arbete med perioder, tidsperioderR-paket.

timeperiodsR — ett nytt paket för att arbeta med datum som publicerades på CRAN i september 2019.

Installerar paketet timeperiodsR:

install.packages("timeperiodsR")

Huvudsyftet är att snabbt bestämma ett visst tidsintervall i förhållande till ett givet datum. Med hjälp av dess funktioner kan du till exempel enkelt:

  • Få den senaste veckan, månaden, kvartalet eller året i R.
  • Få ett specificerat antal tidsintervall i förhållande till ett datum, till exempel de senaste 4 veckorna.
  • Det är lätt att extrahera dess komponenter från det resulterande tidsintervallet: start- och slutdatum, antalet dagar som ingår i intervallet, hela sekvensen av datum som ingår i det.

Namn på alla paketfunktioner timeperiodsR är intuitiva och består av två delar: riktning_intervall, Var:

  • riktning där du behöver flytta i förhållande till ett givet datum: last_n, previous, this, next, next_n.
  • tillfällig intervall för att beräkna perioden: dag, vecka, månad, kvartal, år.

Full uppsättning funktioner:

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

Tidsintervall i tidsperioderR

Dessa funktioner är användbara i de fall du behöver bygga rapporter baserade på data från den senaste veckan eller månaden. För att få den senaste månaden, använd funktionen med samma namn previous_month():

prmonth <- previous_month()

Därefter har du ett objekt per månad klass TPR, från vilken följande komponenter lätt kan erhållas:

  • periodens startdatum, i vårt exempel är detta den sista månaden
  • periodens slutdatum
  • antal dagar som ingår i perioden
  • sekvens av datum som ingår i perioden

Dessutom kan du få var och en av komponenterna på olika sätt:

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

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

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

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

Du kan också få någon av komponenterna med argumentet del, som finns i var och en av paketfunktionerna. Möjliga värden: start, slut, sekvens, längd.

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

Så låt oss titta på alla argument som finns tillgängliga i paketfunktionerna timeperiodsR:

  • x — Referensdatumet från vilket tidsperioden kommer att beräknas, det aktuella datumet som standard.
  • n — Antalet intervaller som kommer att ingå i perioden, till exempel de föregående 3 veckorna;
  • part — Vilken komponent i objektet tpr du behöver skaffa, som standard all;
  • week_start — Argumentet finns endast i funktioner för att arbeta med veckor, och låter dig ställa in numret på den veckodag som ska anses vara dess början. Som standard är veckans början måndag, men du kan ställa in vilken som helst från 1 - måndag till 7 - söndag.

Således kan du beräkna vilken tidsperiod som helst i förhållande till det aktuella eller något annat givet datum; här är några fler exempel:

# получить 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 är söndag:
Arbeta med datum i R (grundläggande funktioner, såväl som paketen för smörjning och tidsperioder)

Vi behöver en period som, relativt den 6 oktober, kommer att ta de föregående 3 veckorna. Inte inklusive veckan som innehåller själva 6 oktober. Följaktligen är detta perioden från 9 september till 29 september.

Arbeta med datum i R (grundläggande funktioner, såväl som paketen för smörjning och tidsperioder)

# получить месяц отстающий на 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 det här exemplet är vi intresserade av månaden som var 4 månader sedan, om vi börjar från 16 september 2019 så var det maj 2019.

Filtrera en vektor av datum med tidsperioderR

För att filtrera in datum timeperiodsR Det finns flera operatörer:

  • %left_out% - jämför två tpr-klassobjekt och returnerar värdet från det vänstra som saknas i det högra.
  • %left_in% - jämför två objekt i tpr-klassen och returnerar datumen från det vänstra objektet som ingår i det högra.
  • %right_out% - jämför två tpr-klassobjekt och returnerar värdet från det högra som saknas från det vänstra.
  • %right_in% - jämför två objekt i klassen tpr och returnerar datum från det högra objektet som finns i det vänstra.

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

Vid paketet timeperiodsR det finns en officiell, ryskspråkig sådan YouTube-spellista.

Slutsats

Vi undersökte i detalj de klasser av objekt som är designade på R-språket för att arbeta med datum. Nu kan du också utföra aritmetiska operationer på datum och snabbt få alla tidsperioder med hjälp av paketet timeperiodsR.

Om du är intresserad av R-språket inbjuder jag dig att prenumerera på min telegramkanal R4marketing, där jag dagligen delar med mig av användbart material om att använda R-språket för att lösa dina dagliga problem.

Källa: will.com

Lägg en kommentar