Att få det aktuella datumet i vilket programmeringsspråk som helst är en operation som motsvarar "Hello world!". Språket R är inget undantag.
I den här artikeln ska vi ta en titt på hur man arbetar med datum i R:s grundläggande syntax samt granska några användbara paket som utökar dess funktioner när det gäller datum:
lubridate— ett paket som möjliggör aritmetiska beräkningar mellan datum;timeperiodsR— ett paket för att arbeta med tidsintervall och deras komponenter.

Innehåll
Om du är intresserad av dataanalys, och särskilt språket R, kan mina och kanaler vara av intresse. Största delen av innehållet ägnas åt språket R.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
Arbetet med datum i R:s grundläggande syntax
Konvertering av text till datum
I grundläggande R finns en uppsättning funktioner för att arbeta med datum. Nackdelen med grundsyntaxen är att namn och argument för funktioner är väldigt spridda och saknar logisk koppling. Ändå måste man känna till grundläggande funktioner, så vi börjar just där.
När du laddar data i R, från csv-filer eller andra källor, får du oftast datum i form av text. För att omvandla denna text till rätt datatype, 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() som accepterar datum i två format: ÅÅÅÅ-MM-DD eller ÅÅÅÅ/MM/DD.
Om dina datadata representeras i ett annat format kan du använda argumentet format.
as.Date("September 26, 2019", format = "%B %d, %Y")format som tar i stringformat operatorer som representerar något tidsintervall och dess format, de mest använda värdena anges i tabellen nedan:
Format
Beskrivning
%d
Dagnummer i månaden
%a
Förkortning av veckodagen
%A
Helt namn på veckodagen
%w
Veckodag nummer (0-6, där 0 är söndag)
%m
Tvåsiffrig månadbeteckning (01-12)
%b
Förkortning av månadsnamnet (apr, mar, …)
%B
Helt namn på månaden
%y
Tvåsiffrig års beteckning
%Y
Fyra-siffrig års beteckning
%j
Dagnummer på året (001 — 366)
%U
Vecka nummer på året (00 - 53), vecka börjar på Söndag
%W
Vecka nummer på året (00 - 53), vecka börjar på Måndag
Därför, "September 26, 2019" är det fullständiga namnet på månaden, datum och år. Detta datumformat kan beskrivas med följande operators:"%B %d, %Y".
Hvor:
%B— Fullständigt namn på månaden%d— Nummer på dagen i månaden%Y— Fyra siffror som representerar året
När du beskriver datumformatet är det viktigt att inkludera alla extra tecken som finns i din sträng, till exempel bindestreck, kommatecken, punkter, mellanslag och så vidare. I mitt exempel, "September 26, 2019", finns det ett kommatecken efter datumet, och det måste också inkluderas i formatbeskrivningen."%B %d, %Y".
Det finns situationer där du får ett datum som inte bara inte överensstämmer med standardformaten (YYYY-MM-DD eller YYYY/MM/DD), utan dessutom på ett språk som är annorlunda än det som är inställt som standard på ditt operativsystem. Till exempel har du laddat ner data där datumet anges som "15 december 2019". Innan du konverterar denna sträng till ett datum måste du ändra lokal.
# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")Utdrag av datumkomponenter i grundläggande R
I grundläggande R finns det inte så många funktioner som gör det möjligt att extrahera någon del av datumet från ett objekt av klassen Datum.
current_date <- Sys.Date() # nuvarande datum
weekdays(current_date) # få veckodag
months(current_date) # få månad nummer på året
quarters(current_date) # få kvartalsnummer på åretFörutom huvudklassen av objekt Datum finns det två andra datatyper i grundläggande R som lagrar tidsstämplar: POSIXlt, POSIXct. Huvudskillnaden mellan dessa klasser är att de, förutom datum, också lagrar tid. Datum Sys.time()
# получить текущую дату и время
current_time <- Sys.time()
# узнать класс объекта current_time
class(current_time)# "POSIXct" "POSIXt"
Funktionen returnerar nuvarande datum och tid i formatet . Detta format liknar POSIXctUNIXTIME , och lagrar antalet sekunder sedan början av UNIX-eran(midnatt (UTC) den 31 december 1969 till 1 januari 1970) det lagrar också tid och datum, och alla dess komponenter. Därför är det ett objekt med en mer komplex struktur, men från vilket det är lätt att få vilken komponent som helst av datum och tid eftersom det i grunden.
Klassen POSIXlt Omvandling av numeriska och textdata till formatet POSIXlt detta 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 # часовой поясPOSIX* görs med hjälp av funktioner as.POSIXct() as.POSIXlt() och . Dessa funktioner har ett litet antal argument.x — Nummer, sträng eller objekt av klassen
- , som behöver konverteras; Datumtz — Tidszon, standard är "GMT";
- format — Beskrivning av datumformatet som data överförs till argumentet x i;
- format — Beskrivning av datumsformatet i vilket uppgifterna som överförs i argumentet x presenteras;
- origin — Används endast vid konvertering av tal till POSIX, detta argument måste tilldelas ett datum- och tidsobjekt från vilket sekunderna räknas. Vanligtvis används för att konvertera från UNIXTIME.
Om dina datum- och tidsdata presenteras i , och lagrar antalet sekunder sedan början av UNIX-eran, använd följande exempel för att konvertera dem till ett tydligt, läsbart datum:
# Конвертируем UNIXTIME в читаемую дату
as.POSIXlt(1570084639, origin = "1970-01-01")I origin kan du ange vilken tidsstämpel som helst. Till exempel, om i dina data datum och tid anges som antalet sekunder från den 15 september 2019 klockan 12:15, använd följande för att omvandla dem till datum:
# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123, origin = "2019-09-15 12:15:00")Arbete med datum med hjälp av paketet lubridate
lubridate kanske det mest populära paketet för att arbeta med datum i R-språket. Det ger dig dessutom tre ytterligare klasser.
- durations — längd, det vill säga antal sekunder mellan två tidsstämplar;
- periods — perioder som gör det möjligt att utföra beräkningar mellan datum med mänskligt begripliga intervall: dagar, månader, veckor och så vidare;
- intervals — objekt som ger en start- och slutpunkt i tiden.
Installation av ytterligare paket i R-språket görs med den standardfunktion install.packages().
Installation av paketet lubridate:
install.packages("lubridate")Konvertering av text till datum med hjälp av lubridate
Funktioner i paketet lubridate förenklar avsevärt processen att konvertera text till datum, samt låter dig utföra eventuella aritmetiska operationer med datum och tid.
För att få det aktuella datumet, eller datum och tid, hjälper funktionerna today() och now().
today() # aktuellt datum
now() # aktuellt datum och tidFör att omvandla en sträng till datum i lubridate finns en hel familj av funktioner vars namn alltid består av tre bokstäver och representerar komponenterna i datumet:
- y — år
- m — månad
- d — dag
Lista med funktioner för att konvertera text till datum via lubridate
ymd()ydm()mdy()myd()dmy()dym()yq()
Några exempel för att omvandla strängar till datum:
ymd("2017 jan 21")
mdy("March 20th, 2019")
dmy("1st april of 2018")Som du ser lubridate kan den avsevärt mer effektivt känna igen datumbeskrivningar i textform, och låter dig omvandla text till datum utan att använda ytterligare operatorer för att beskriva formatet.
Utdrag av datumkomponenter med hjälp av paketet lubridate
Dessutom kan du med lubridate få vilket komponent som helst från ett datum:
dt <- ymd("2017 jan 21")
year(dt) # år
month(dt) # månad
mday(dt) # dag i månaden
yday(dt) # dag på året
wday(dt) # veckodagAritmetiska operationer med datum
Men den mest viktiga och grundläggande funktionaliteten lubridate ligger i möjligheten att utföra olika aritmetiska operationer med datum.
Datumav rundas genom tre funktioner:
floor_date— avrundning till närmaste föregående tidceiling_date— avrundning till närmaste framtida tidround_date— avrundning till närmaste tid
Varje av dessa funktioner har en parameter -tester i projektet, samt i relation till filer., som låter dig ange avrundningsenheten: second, minute, hour, day, week, month, bimonth, quarter, season, halfyear, year
dt <- ymd("2017 jan 21")
round_date(dt, unit = "month") # avrunda till månad
round_date(dt, unit = "3 month") # avrunda till 3 månader
round_date(dt, unit = "quarter") # avrunda till kvartal
round_date(dt, unit = "season") # avrunda till säsong
round_date(dt, unit = "halfyear") # avrunda till halvårLåt oss förstå hur man får ett datum som är 8 dagar efter dagens datum och utföra olika andra aritmetiska beräkningar mellan två datum.
today() + days(8) # vilket datum blir det om 8 dagar
today() - months(2) # vilket datum var det för 2 månader sedan
today() + weeks(12) # vilket datum blir det om 12 veckor
today() - years(2) # vilket datum var det för 2 år sedanFörenklad hantering av tidsperioder, paketet timeperiodsR.
timeperiodsR — ett nytt paket för datamanipulation som publicerades på CRAN i september 2019.
Installation av paketet timeperiodsR:
install.packages("timeperiodsR")Huvudsyftet är att snabbt definiera en viss tidsintervall relativt ett angivet datum. Till exempel kan du enkelt med dess funktioner:
- Få föregående vecka, månad, kvartal eller år i R.
- Få ett angivet antal tidsintervall relativt datumet, till exempel föregående 4 veckor.
- Enkelt extrahera komponenterna från det resulterande tidsintervallet: start- och slutdatum, antalet dagar ingående i intervallet, hela sekvensen av datum som ingår.
Namnen på alla funktioner i paketet timeperiodsR är intuitivt förståeliga och består av två delar: riktning_intervall, där:
- riktning i vilken riktning man måste röra sig relativt det angivna datumet: last_n, previous, this, next, next_n.
- tidsperiod intervall för att beräkna perioden: day, week, month, quarter, year.
Hela uppsättningen 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 timeperiodsR
Dessa funktioner är användbara i fall där du behöver skapa rapporter baserat på data från föregående vecka eller månad. För att få föregående månad kan du använda med samma namn funktion previous_month():
prmonth <- previous_month()Efter vilket ni får ett objekt prmonth klassen tpr, från vilket det enkelt går att erhålla följande komponenter:
- startdatum för perioden, i vårt exempel förra månaden
- slutdatum för perioden
- antal dagar som ingår i perioden
- sekvensen av datum som ingår i perioden
Dessutom kan varje av komponenterna erhållas på olika sätt:
# первый день периода
prmonth$start
start(prmonth)
# последний день периода
prmonth$end
end(prmonth)
# последовательность дат
prmonth$sequence
seq(prmonth)
# количество дней входящих в период
prmonth$length
length(prmonth)Ni kan också få någon av komponenterna med hjälp av argumentet part, som finns i varje funktion i paketet. Möjliga värden: start, end, sequence, length.
previous_month(part = "start") # start av period
previous_month(part = "end") # slut av period
previous_month(part = "sequence") # sekvens av datum
previous_month(part = "length") # antal dagar i periodenSå låt oss gå igenom alla argument som är tillgängliga i funktionerna i paketet timeperiodsR:
x– Referensdag från vilken tidsperioden kommer att beräknas, som standard är det det aktuella datumet;n– Antal intervaller som kommer att ingå i perioden, till exempel de 3 föregående veckorna;part– Vilken komponent av objektettprdu behöver få, som standardall;week_start– Argumentet finns endast i funktioner för att arbeta med veckor, och låter er ange veckans startdag, som standard är veckans början måndag, men ni kan ange vilken som helst från 1 – måndag till 7 – söndag.
Således kan ni beräkna vilken tidsperiod som helst relativt till det aktuella datumet eller något annat angivet datum, jag ska ge ytterligare några exempel:
# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06",
n = 3,
week_start = 1) Tidsperiod: från 9 september 2019, måndag till 29 september 2019, söndag6 oktober är en söndag:

Vi behöver en period som i förhållande till 6 oktober tar de 3 föregående veckorna. Utan att inkludera den vecka som innehåller själva 6 oktober. Därmed är perioden från 9 till 29 september.

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4) Tidsperiod: från 1 maj 2019, onsdag till 31 maj 2019, fredagI detta exempel intresserar vi oss för månaden som var 4 månader sedan, om vi utgår från 16 september 2019, vilket alltså var maj 2019.
Filtrering av datumvektor med hjälp av timeperiodsR
För att filtrera datum i timeperiodsR finns det flera operatorer:
- %left_out% — jämför två objekt av klassen tpr, och returnerar värdet från vänster, som saknas i höger.
- %left_in% — jämför två objekt av klassen tpr, och returnerar datum från det vänstra objektet som ingår i det högra.
- %right_out% — jämför två objekt av klassen tpr, och returnerar värdet från höger, som saknas i vänster.
- %right_in% — jämför två objekt av 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 # hämta datum från period1 som ingår i period2
period1 %left_out% period2 # hämta datum från period1 som inte ingår i period2
period1 %right_in% period2 # hämta datum från period2 som ingår i period1
period1 %right_out% period2 # hämta datum från period2 som inte ingår i period1Paketet timeperiodsR har en officiell svenskspråkig .
Slutsats
Vi har noggrant granskat objektklasserna som är avsedda för datumhantering i språket R. Nu kan du också utföra aritmetiska operationer på datum och snabbt få hjälp av paketet för att få alla tidsperioder. timeperiodsR.
Om du är intresserad av språket R, bjuder jag in dig att följa min Telegram-kanal. , där jag dagligen delar användbara material om hur man använder språket R för att lösa mina vardagliga uppgifter.
Källa: habr.com
