De huidige datum verkrijgen in elke programmeertaal is vergelijkbaar met "Hallo wereld!". De programmeertaal R is hierop geen uitzondering.
In dit artikel bespreken we hoe je met datums werkt in de basis syntaxis van de programmeertaal R, en bekijken we een paar nuttige pakketten die de mogelijkheden bij het werken met datums uitbreiden:
lubridate— een pakket dat het mogelijk maakt om rekenkundige bewerkingen tussen datums uit te voeren;timeperiodsR— een pakket voor het werken met tijdsintervallen en hun componenten.

Inhoud
Als je geïnteresseerd bent in data-analyse, en in het bijzonder de programmeertaal R, dan zijn mijn en kanalen misschien interessant voor je. Het merendeel van de content is gewijd aan de programmeertaal R.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
Werken met datums in de basis syntaxis van R
Tekst omzetten naar datum
In basis R is er een set functies voor het werken met datums. Een nadeel van de basis syntaxis is dat de schrijfwijze van namen en argumenten van functies erg verspreid is en bijna geen logische samenhang heeft. Desondanks is het essentieel om de basisfuncties van de taal te kennen, daarom beginnen we hier ook mee.
Wanneer je gegevens in R laadt, bijvoorbeeld uit csv-bestanden of andere bronnen, krijg je vaak de datum in de vorm van tekst. Om deze tekst naar het juiste gegevenstype om te zetten, gebruik je de functie 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"Standaard as.Date() die de datum in twee formaten accepteert: JJJJ-MM-DD of JJJJ/MM/DD.
Als je dataset datums in een ander formaat bevat, kun je de argumenten voor conversie gebruiken van: format.
as.Date("26 september 2019", format = "%B %d, %Y")format neemt een string aan die operators beschrijft die een tijdsinterval en zijn format aangeven; de meest voorkomende waarden worden in de onderstaande tabel weergegeven:
Formaat
Omschrijving
%d
Dagen van de maand
%a
Afkorting van de naam van de weekdag
%A
Volledige naam van de weekdag
%w
Nummer van de weekdag (0-6, waarbij 0 zondag is)
%m
Twee-cijferige aanduiding van de maand (01-12)
%b
Afkorting van de maandnaam (apr, mar, …)
%B
Volledige naam van de maand
%y
Twee-cijferige aanduiding van het jaar
%Y
Vier-cijferige aanduiding van het jaar
%j
Dagnummer van het jaar (001 — 366)
%U
Weeknummer van het jaar (00 — 53), week begint op zondag
%W
Weeknummer van het jaar (00 — 53), week begint op maandag
Daarom is "26 september 2019" de volledige naam van de maand, dag en jaar. Dit datumformaat kan als volgt worden beschreven:"%B %d, %Y".
Waarbij:
%B— Volledige naam van de maand%d— Nummer van de dag in de maand%Y— Viercijferig jaartal
Bij het beschrijven van het datumformaat is het belangrijk om alle extra symbolen uit uw string op te nemen, zoals streepjes, komma's, punten, spaties, enzovoort. In mijn voorbeeld, "26 september 2019", staat er een komma na de datum, en in de beschrijving van het formaat moet ook een komma worden geplaatst:"%B %d, %Y".
Er zijn situaties waarin je een datum ontvangt die niet alleen niet voldoet aan de standaardformaten (JJJJ-MM-DD of JJJJ/MM/DD), maar ook in een taal die verschilt van de standaardtaal in uw besturingssysteem. Bijvoorbeeld, je hebt gegevens geladen waar de datum in de volgende vorm is aangegeven: "15 december 2019". Voor je deze string in een datum converteert, moet je de locale wijzigen.
# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")Componenten van een datum extraheren in basis R
In basis R zijn er niet zo veel functies die een deel van de datum uit een object van de klasse Date.
current_date <- Sys.Date() # huidige datum
weekdays(current_date) # krijg het weekdagnummer
months(current_date) # krijg het maandnummer van het jaar
quarters(current_date) # krijg het kwartaalnummer van het jaarNaast de basis klasse van objecten Date zijn er in basis R nog 2 datatypes die tijdstempels opslaan: POSIXlt, POSIXct. Het belangrijkste verschil tussen deze klassen en Date is dat ze naast de datum ook tijd opslaan.
# получить текущую дату и время
current_time <- Sys.time()
# узнать класс объекта current_time
class(current_time)# "POSIXct" "POSIXt"
Functie Sys.time() geeft de huidige datum en tijd in het formaat terug POSIXct. Dit formaat is logisch vergelijkbaar met UNIXTIME, en slaat het aantal seconden op sinds het begin van het UNIX-tijdperk (middernacht (UTC) van 31 december 1969 tot 1 januari 1970).
Klasse POSIXlt het slaat ook tijd en datum op, en al hun componenten. Daarom is het een object met een complexere structuur, maar waarvan gemakkelijk elke component van datum en tijd kan worden verkregen, omdat het in wezen POSIXlt het lijst.
# Получаем текущую дату и время
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 # часовой поясDe conversie van numerieke en tekstuele gegevens naar de formaten POSIX* wordt uitgevoerd met de functies as.POSIXct() en as.POSIXlt(). Deze functies hebben een klein aantal argumenten.
- x — Een getal, string of object van de klasse Date, dat moet worden geconverteerd;
- tz — Tijdzone, standaard "GMT";
- format — Beschrijving van het datumformaat waarin de gegevens zijn gepresenteerd die aan de argument x zijn doorgegeven;
- origin — Wordt alleen gebruikt bij de conversie van een getal naar POSIX; voor dit argument moet een datumobject en tijd worden doorgegeven waaruit de seconden worden geteld. Het wordt meestal gebruikt voor de overgang van UNIXTIME.
Als uw datum- en tijdgegevens zijn weergegeven in UNIXTIME, gebruik dan het volgende voorbeeld voor de conversie naar een begrijpelijke, leesbare datum:
# Конвертируем UNIXTIME в читаемую дату
as.POSIXlt(1570084639, origin = "1970-01-01")In origin kunt u elke tijdstempel opgeven. Als bijvoorbeeld in uw gegevens datum en tijd worden weergegeven als een aantal seconden vanaf 15 september 2019 om 12:15, gebruik dan de volgende code om deze naar een datum te converteren:
# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123, origin = "2019-09-15 12:15:00")Werken met datums met behulp van het pakket lubridate
lubridate waarschijnlijk het populairste pakket voor het werken met data in de taal R. Het biedt u ook nog eens drie extra klassen.
- durations — de duur, oftewel het aantal seconden tussen twee tijdstempels;
- periods — periodes waarmee berekeningen tussen data in voor mensen begrijpelijke intervallen kunnen worden gemaakt: dagen, maanden, weken, enzovoorts;
- intervals — objecten die het begin- en eindmoment van tijd bieden.
Het installeren van extra pakketten in de taal R gebeurt met de standaardfunctie install.packages().
Het installeren van het pakket lubridate:
install.packages("lubridate")Tekst omzetten naar datum met behulp van lubridate
De functies van het pakket lubridate vereenvoudigen aanzienlijk het proces van het converteren van tekst naar datum en stellen u ook in staat om allerlei rekenkundige bewerkingen met datums en tijden uit te voeren.
Voor het verkrijgen van de huidige datum of datum en tijd helpen de functies today() en now().
today() # huidige datum
now() # huidige datum en tijdVoor het omzetten van een string naar een datum in lubridate is er een hele reeks functies waarvan de namen altijd uit drie letters bestaan en de volgorde van de datumcomponenten aangeven:
- y — jaar
- m — maand
- d — dag
Lijst van functies voor het omzetten van tekst naar datum via lubridate
ymd()ydm()mdy()myd()dmy()dym()yq()
Enkele voorbeelden voor het omzetten van strings naar datums:
ymd("2017 jan 21")
mdy("20 maart 2019")
dmy("1 april 2018")Zoals u kunt zien, lubridate is aanzienlijk effectiever in het herkennen van datum beschrijvingen in tekstvorm, en biedt u de mogelijkheid om tekst naar datum om te zetten zonder extra operatoren voor het beschrijven van het formaat te gebruiken.
Componenten van datums extraheren met behulp van het pakket lubridate
Met behulp van lubridate kun je ook elk onderdeel van de datum verkrijgen:
dt <- ymd("2017 jan 21")
year(dt) # jaar
month(dt) # maand
mday(dt) # dag van de maand
yday(dt) # dag van het jaar
wday(dt) # dag van de weekRekenkundige bewerkingen met datums
Maar de meest belangrijke en essentiële functionaliteit lubridate ligt in de mogelijkheid om verschillende rekenkundige bewerkingen met datums uit te voeren.
De datumafrondeing gebeurt met drie functies:
floor_date— afronden naar de dichtstbijzijnde verstreken tijdceiling_date— afronden naar de dichtstbijzijnde toekomstige tijdround_date— afronden naar de dichtstbijzijnde tijd
Elke van deze functies heeft een argument type, waarmee je de afrondingseenheid kunt opgeven: second, minute, hour, day, week, month, bimonth, quarter, season, halfyear, year
dt <- ymd("2017 jan 21")
round_date(dt, unit = "month") # afronden naar maand
round_date(dt, unit = "3 month") # afronden naar 3 maanden
round_date(dt, unit = "quarter") # afronden naar kwartaal
round_date(dt, unit = "season") # afronden naar seizoen
round_date(dt, unit = "halfyear") # afronden naar halfjaarLaten we eens bekijken hoe we de datum kunnen verkrijgen die 8 dagen na de huidige datum ligt en verschillende andere rekenkundige berekeningen tussen twee datums kunnen uitvoeren.
today() + days(8) # welke datum is het over 8 dagen
today() - months(2) # welke datum was 2 maanden geleden
today() + weeks(12) # welke datum is het over 12 weken
today() - years(2) # welke datum was 2 jaar geledenVereenvoudigd werken met perioden, het pakket timeperiodsR.
timeperiodsR — een nieuw pakket voor datums, dat in september 2019 op CRAN is gepubliceerd.
Het installeren van het pakket timeperiodsR:
install.packages("timeperiodsR")Het belangrijkste doel is de snelle bepaling van een bepaalde tijdsperiode ten opzichte van een opgegeven datum. Met zijn functies kun je bijvoorbeeld gemakkelijk:
- De afgelopen week, maand, kwartaal of jaar in R krijgen.
- Een opgegeven aantal tijdsintervallen ten opzichte van een datum verkrijgen, bijvoorbeeld de afgelopen 4 weken.
- Gemakkelijk de componenten van het verkregen tijdsinterval extraheren: de start- en einddatum, het aantal dagen dat in het interval valt, en de volledige reeks datums die daarin vallen.
De namen van alle functies in het pakket timeperiodsR zijn intuïtief en bestaan uit twee delen: richting_interval, waar:
- richting waarover je je moet bewegen ten opzichte van de opgegeven datum: last_n, previous, this, next, next_n.
- tijdseenheid interval voor de berekening van de periode: day, week, month, quarter, year.
Een volledige set functies:
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()
Tijdsintervallen in timeperiodsR
Deze functies zijn nuttig in situaties waarin je rapporten moet opstellen op basis van gegevens van de afgelopen week of maand. Gebruik de gelijknamige functie om de afgelopen maand te verkrijgen previous_month():
prmonth <- previous_month()Daarna heeft u een object prmonth klasse tpr, waaruit u gemakkelijk de volgende componenten kunt verkrijgen:
- de startdatum van de periode, in ons voorbeeld is dit vorige maand
- de einddatum van de periode
- aantal dagen binnen de periode
- de reeks data binnen de periode
U kunt bovendien elke component op verschillende manieren verkrijgen:
# первый день периода
prmonth$start
start(prmonth)
# последний день периода
prmonth$end
end(prmonth)
# последовательность дат
prmonth$sequence
seq(prmonth)
# количество дней входящих в период
prmonth$length
length(prmonth)U kunt ook een van de componenten verkrijgen met behulp van het argument part, dat aanwezig is in elke functie van het pakket. Mogelijke waarden: start, end, sequence, length.
previous_month(part = "start") # start van de periode
previous_month(part = "end") # einde van de periode
previous_month(part = "sequence") # datumsreeks
previous_month(part = "length") # aantal dagen in de periodeLaten we nu alle argumenten bekijken die beschikbaar zijn in de functies van het pakket timeperiodsR:
x— De referentiedatum vanaf welke de tijdsperiode wordt berekend, standaard is de huidige datum;n— Aantal intervallen die in de periode zullen worden opgenomen, bijvoorbeeld 3 voorgaande weken;part— Welk component van het objecttpru nodig heeft, standaardall;week_start— Dit argument is alleen aanwezig in functies voor het werken met weken, en stelt de weekdag in die als het begin ervan zal worden beschouwd, standaard is maandag het begin van de week, maar u kunt elke dag van 1 – maandag tot 7 – zondag instellen.
Op deze manier kunt u elke tijdsperiode berekenen ten opzichte van de huidige of enige andere opgegeven datum, hier zijn nog enkele voorbeelden:
# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06",
n = 3,
week_start = 1) Tijdsperiode: van 9 september 2019, maandag tot 29 september 2019, zondag6 oktober is een zondag:

We hebben een periode nodig die ten opzichte van 6 oktober de 3 vorige weken neemt. Excl. de week waarin 6 oktober zelf valt. Dit is dus de periode van 9 tot 29 september.

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4) Tijdsperiode: van 1 mei 2019, woensdag tot 31 mei 2019, vrijdagIn dit voorbeeld zijn we geïnteresseerd in de maand die 4 maanden geleden was, als we uitgaan van 16 september 2019, was dat dus mei 2019.
Filteren van een vector met datums met behulp van timeperiodsR
Voor date filtering in timeperiodsR zijn er verschillende operatoren:
- %left_out% — vergelijkt twee objecten van de klasse tpr, en retourneert de waarden uit de linker die niet in de rechter aanwezig zijn.
- %left_in% — vergelijkt twee objecten van de klasse tpr, en retourneert de data uit het linkerobject die in het rechterobject voorkomen.
- %right_out% — vergelijkt twee objecten van de klasse tpr, en retourneert de waarden uit de rechter die niet in de linker aanwezig zijn.
- %right_in% — vergelijkt twee objecten van de klasse tpr en retourneert de data uit het rechter object die in het linker aanwezig zijn.
period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")
period1 %left_in% period2 # verkrijg data uit period1 die in period2 vallen
period1 %left_out% period2 # verkrijg data uit period1 die niet in period2 vallen
period1 %right_in% period2 # verkrijg data uit period2 die in period1 vallen
period1 %right_out% period2 # verkrijg data uit period2 die niet in period1 vallenVan het pakket timeperiodsR is er een officiële Nederlandstalige .
Conclusie
We hebben uitgebreid gekeken naar de klassen van objecten die in de programmeertaal R zijn bedoeld voor het werken met data. Ook nu weet je hoe je rekenkundige operaties op data kunt uitvoeren en snel elke tijdsperiode kunt verkrijgen met behulp van het pakket timeperiodsR.
Als je geïnteresseerd bent in de programmeertaal R, nodig ik je uit om je te abonneren op mijn Telegram-kanaal , waarin ik dagelijks nuttige materialen deel over het gebruik van de programmeertaal R voor het oplossen van mijn dagelijkse taken.
Bron: habr.com
