Werken met datums in R (basismogelijkheden, evenals de lubridate- en timeperiodsR-pakketten)

Haal de huidige datum op in elke programmeertaal, een bewerking die gelijk staat aan "Hallo wereld!" De R-taal is geen uitzondering.

In dit artikel zullen we bekijken hoe het werken met datums werkt in de basissyntaxis van de R-taal, en ook kijken naar verschillende nuttige pakketten die de mogelijkheden ervan uitbreiden bij het werken met datums:

  • lubridate — een pakket waarmee u rekenkundige berekeningen tussen datums kunt uitvoeren;
  • timeperiodsR — een pakket voor het werken met tijdsintervallen en hun componenten.

Werken met datums in R (basismogelijkheden, evenals de lubridate- en timeperiodsR-pakketten)

Inhoud

Als u geïnteresseerd bent in data-analyse, en in het bijzonder de R-taal, bent u wellicht geïnteresseerd in mijn telegram и youtube kanalen. Het grootste deel van de inhoud is gewijd aan de R-taal.

  1. Werken met datums in de standaard R-syntaxis
    1.1. Converteer tekst naar datum
    1.2. Datumcomponenten extraheren in basis R
  2. Werken met dadels met behulp van het lubridate-pakket
    2.1. Converteer tekst naar datum met lubridate
    2.2. Datumcomponenten extraheren met behulp van het smeerpakket
    2.3. Rekenkundige bewerkingen met datums
  3. Vereenvoudigd werken met punten, timeperiodsR-pakket
    3.1. Tijdsintervallen in tijdperiodenR
    3.2. Een vector van datums filteren met behulp van timeperiodsR
  4. Conclusie

Werken met datums in de standaard R-syntaxis

Converteer tekst naar datum

Basic R heeft een reeks functies voor het werken met datums. Het nadeel van de basissyntaxis is dat het geval van functienamen en argumenten erg verspreid is en vrijwel geen logisch verband heeft. U moet echter de basisfuncties van de taal kennen, dus we zullen ermee beginnen.

Meestal ontvangt u bij het laden van gegevens in R, vanuit csv-bestanden of andere bronnen, een datum als tekst. Gebruik de functie om deze tekst naar het juiste gegevenstype te converteren 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"

Bij verstek as.Date() accepteert datum in twee formaten: JJJJ-MM-DD of JJJJ/MM/DD.
Als uw gegevensset datums in een ander formaat bevat, kunt u het argument gebruiken format.

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

formaat accepteert operatoren in tekenreeksvorm die elk tijdsinterval en het formaat ervan aanduiden; de meest gebruikte waarden worden weergegeven in de onderstaande tabel:

formaat
beschrijving

%d
Dagnummer in maand

%a
Afkorting voor de naam van de dag van de week

%A
Volledige naam van de dag van de week

%w
Nummer van de dag van de week (0-6, waarbij 0 zondag is)

%m
Tweecijferige maandaanduiding (01-12)

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

%B
Naam volledige maand

%y
Jaaraanduiding met twee cijfers

%Y
Viercijferige jaaraanduiding

%j
Dagnummer in het jaar (001 - 366)

%U
Nummer van de week in het jaar (00 - 53), begin van de week zondag

%W
Weeknummer in het jaar (00 - 53), begin van de week maandag

Dienovereenkomstig is "26 september 2019" de volledige naam van de maand, datum en jaar. Dit datumformaat kan als volgt worden beschreven met behulp van operatoren:"%B %d, %Y".

Waar:

  • %B — Volledige naam van de maand
  • %d — Nummer van de dag in de maand
  • %Y — Viercijferige jaaraanduiding

Bij het beschrijven van de datumnotatie is het belangrijk om alle extra tekens uit uw tekenreeks op te nemen, zoals streepjes, komma's, punten, spaties, enzovoort. In mijn voorbeeld, “26 september 2019”, staat er een komma na de datum, en je moet ook een komma in de formaatbeschrijving plaatsen:"%B %d, %Y".

Er zijn situaties waarin u een datum ontvangt die niet alleen niet overeenkomt met de standaardformaten (JJJJ-MM-DD of JJJJ/MM/DD), maar ook in een taal die afwijkt van de standaardtaal die op uw besturingssysteem is geïnstalleerd. U heeft bijvoorbeeld gegevens gedownload waarbij de datum als volgt wordt aangegeven: ‘15 december 2019.’ Voordat u deze tekenreeks naar een datum converteert, moet u de landinstelling wijzigen.

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

Datumcomponenten extraheren in basis R

Er zijn niet veel functies in Basic R waarmee u een deel van een datum uit een klassenobject kunt extraheren Datum.

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

Naast de hoofdobjectklasse Datum in basis R zijn er nog 2 gegevenstypen die een tijdstempel opslaan: POSIXlt, POSIXct. Het belangrijkste verschil tussen deze klassen en Datum is dat ze naast de datum ook tijd opslaan.

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

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

# "POSIXct" "POSIXt"

Functie Sys.time() retourneert de huidige datum en tijd in het formaat POSIXct. Dit formaat is qua betekenis vergelijkbaar met UNIXTIJD, 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 de tijd en datum op, en al hun componenten. Daarom is het een object met een complexere structuur, maar waaruit gemakkelijk een datum- en tijdcomponent kan worden afgeleid in werkelijkheid 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  # часовой пояс

Numerieke en tekstgegevens converteren naar formaten POSIX* uitgevoerd door functies as.POSIXct() и as.POSIXlt(). Deze functies hebben een kleine set argumenten.

  • x — Nummer-, string- of klasseobject Datum, die moet worden geconverteerd;
  • tz — Tijdzone, standaard "GMT";
  • formaat — Beschrijving van het datumformaat waarin de gegevens die aan het x-argument zijn doorgegeven, worden weergegeven;
  • origin — Wordt alleen gebruikt bij het converteren van een getal naar POSIX; u moet een datumobject en tijd doorgeven vanaf waar de seconden worden geteld voor dit argument. Meestal gebruikt voor vertaling vanuit UNIXTIME.

Als uw datum- en tijdinformatie binnen is UNIXTIJDen gebruik het volgende voorbeeld om ze om te zetten in een duidelijke, leesbare datum:

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

In oorsprong kunt u elke tijdstempel opgeven. Als uw gegevens bijvoorbeeld de datum en tijd bevatten als het aantal seconden sinds 15 september 2019 12:15 uur, gebruikt u het volgende om deze naar een datum te converteren:

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

Werken met dadels met behulp van het lubridate-pakket

lubridate Misschien wel het meest populaire pakket voor het werken met datums in de taal R. Het biedt u drie extra klassen.

  • duur — duur, d.w.z. aantal seconden tussen twee tijdstempels;
  • perioden - met perioden kunt u berekeningen maken tussen datums in voor mensen leesbare intervallen: dagen, maanden, weken, enzovoort;
  • intervallen - objecten die het begin- en eindpunt in de tijd aangeven.

Installatie van extra pakketten in de R-taal wordt uitgevoerd met behulp van de standaardfunctie install.packages().

Het pakket installeren lubridate:

install.packages("lubridate")

Converteer tekst naar datum met lubridate

Pakketfuncties lubridate vereenvoudigt het proces van het converteren van tekst naar een datum aanzienlijk, en stelt u ook in staat alle rekenkundige bewerkingen met datums en tijden uit te voeren.

Met de functies kunt u de huidige datum of datum en tijd verkrijgen today() и now().

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

Om een ​​tekenreeks naar een datum te converteren in lubridate Er is een hele familie van functies waarvan de naam altijd uit drie letters bestaat en de volgorde van de datumcomponenten aangeeft:

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

Lijst met functies voor het converteren van tekst naar datum via lubridate

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

Enkele voorbeelden voor het converteren van tekenreeksen naar datums:

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

Zoals je kan zien lubridate Het is veel efficiënter in het herkennen van datumbeschrijvingen als tekst, en stelt u in staat tekst naar datum te converteren zonder extra operators te gebruiken om het formaat te beschrijven.

Datumcomponenten extraheren met behulp van het smeerpakket

Ook gebruiken lubridate je kunt elk onderdeel krijgen vanaf een datum:

dt <- ymd("2017 jan 21")

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

Rekenkundige bewerkingen met datums

Maar de belangrijkste en basisfunctionaliteit lubridate is de mogelijkheid om verschillende rekenkundige bewerkingen met datums uit te voeren.

Datumafronding wordt uitgevoerd door drie functies:

  • floor_date - afgerond op de dichtstbijzijnde verleden tijd
  • ceiling_date - afgerond op de nabije toekomende tijd
  • round_date - afronden naar de dichtstbijzijnde tijd

Elk van deze functies heeft een argument eenheidwaarmee u de afrondingseenheid kunt opgeven: seconde, minuut, uur, dag, week, maand, tweemaandelijks, kwartaal, seizoen, 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") # округлить до полугодия

Laten we dus eens kijken hoe we een datum kunnen krijgen die 8 dagen na de huidige datum ligt, en verschillende andere rekenkundige berekeningen tussen de twee datums uitvoeren.

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

Vereenvoudigd werken met punten, timeperiodsR-pakket.

timeperiodsR — een nieuw pakket voor het werken met datums dat in september 2019 op CRAN werd gepubliceerd.

Het pakket installeren timeperiodsR:

install.packages("timeperiodsR")

Het belangrijkste doel is om snel een bepaald tijdsinterval ten opzichte van een bepaalde datum te bepalen. Met behulp van de functies kunt u bijvoorbeeld eenvoudig:

  • Haal de afgelopen week, maand, kwartaal of jaar op in R.
  • Krijg een bepaald aantal tijdsintervallen ten opzichte van een datum, bijvoorbeeld de afgelopen 4 weken.
  • Het is gemakkelijk om de componenten ervan uit het resulterende tijdsinterval te halen: de begin- en einddatum, het aantal dagen dat in het interval is opgenomen, de volledige reeks datums die erin zijn opgenomen.

Naam van alle pakketfuncties timeperiodsR zijn intuïtief en bestaan ​​uit twee delen: richting_interval, Waar:

  • richting waarin u zich moet verplaatsen ten opzichte van een bepaalde datum: last_n, previous, this, next, next_n.
  • tijdelijk interval om de periode te berekenen: dag, week, maand, kwartaal, jaar.

Volledige functieset:

  • 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 tijdperiodenR

Deze functies zijn handig als u rapporten moet samenstellen op basis van gegevens van de afgelopen week of maand. Gebruik de gelijknamige functie om de laatste maand te achterhalen previous_month():

prmonth <- previous_month()

Daarna heb je een object pmaand klasse TPR, waaruit de volgende componenten gemakkelijk kunnen worden verkregen:

  • de startdatum van de periode, in ons voorbeeld is dit de laatste maand
  • einddatum van de periode
  • aantal dagen dat in de periode valt
  • reeks data die in de periode zijn opgenomen

Bovendien kunt u elk van de componenten op verschillende manieren verkrijgen:

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

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

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

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

U kunt ook elk van de componenten verkrijgen met behulp van het argument deel, die aanwezig is in elk van de pakketfuncties. Mogelijke waarden: begin, einde, reeks, lengte.

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

Laten we dus eens kijken naar alle argumenten die beschikbaar zijn in de pakketfuncties timeperiodsR:

  • x — De referentiedatum vanaf welke de tijdsperiode wordt berekend, standaard de huidige datum;
  • n — Het aantal intervallen dat in de periode wordt opgenomen, bijvoorbeeld de voorgaande 3 weken;
  • part — Welk onderdeel van het object tpr je moet standaard krijgen all;
  • week_start — Het argument is alleen aanwezig in functies voor het werken met weken, en stelt u in staat het nummer van de dag van de week in te stellen die als het begin ervan wordt beschouwd. Standaard is het begin van de week maandag, maar u kunt elk van de volgende waarden instellen: 1 - maandag tot 7 - zondag.

U kunt dus elke tijdsperiode berekenen ten opzichte van de huidige of een andere gegeven datum; hier zijn nog een paar voorbeelden:

# получить 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 zondag:
Werken met datums in R (basismogelijkheden, evenals de lubridate- en timeperiodsR-pakketten)

We hebben een periode nodig die, ten opzichte van 6 oktober, de voorgaande 3 weken zal duren. Exclusief de week waarin 6 oktober zelf valt. Dit is dus de periode van 9 september tot 29 september.

Werken met datums in R (basismogelijkheden, evenals de lubridate- en timeperiodsR-pakketten)

# получить месяц отстающий на 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 dit voorbeeld zijn we geïnteresseerd in de maand die 4 maanden geleden was, als we beginnen op 16 september 2019, dan was het mei 2019.

Een vector van datums filteren met behulp van timeperiodsR

Datums filteren timeperiodsR Er zijn verschillende exploitanten:

  • %left_out% - vergelijkt twee tpr-klasseobjecten en retourneert de waarde van de linker die ontbreekt in de rechter.
  • %left_in% - vergelijkt twee objecten van de tpr-klasse en retourneert de datums van het linkerobject die zijn opgenomen in het rechterobject.
  • %right_out% - vergelijkt twee tpr-klasseobjecten en retourneert de waarde van de rechter die ontbreekt in de linker.
  • %right_in% - vergelijkt twee objecten van de tpr-klasse en retourneert datums van het rechterobject die aanwezig zijn in het linkerobject.

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

Bij het pakket timeperiodsR er is een officiële, Russischtalige versie YouTube-afspeellijst.

Conclusie

We hebben in detail de klassen van objecten onderzocht die zijn ontworpen in de R-taal voor het werken met datums. Ook kunt u nu rekenkundige bewerkingen op datums uitvoeren en snel tijdsperioden verkrijgen met behulp van het pakket timeperiodsR.

Als je geïnteresseerd bent in de R-taal, nodig ik je uit om je te abonneren op mijn telegramkanaal R4marketing, waarin ik dagelijks nuttige materialen deel over het gebruik van de R-taal bij het oplossen van je dagelijkse problemen.

Bron: www.habr.com

Voeg een reactie