Arbeiten mit Daten in R (grundlegende Funktionen sowie die Pakete lubridate und timeperiodsR)

Das Abrufen des aktuellen Datums in jeder Programmiersprache ist äquivalent zu „Hello World!“. Die Sprache R bildet da keine Ausnahme.

In diesem Artikel werden wir untersuchen, wie das Arbeiten mit Daten im grundlegenden Syntax von R funktioniert, und wir werden einige nützliche Pakete betrachten, die seine Funktionen zur Arbeit mit Daten erweitern:

  • lubridate — ein Paket, das arithmetische Berechnungen zwischen Daten ermöglicht;
  • timeperiodsR — ein Paket zur Arbeit mit Zeitintervallen und ihren Komponenten.

Arbeiten mit Daten in R (grundlegende Funktionen sowie die Pakete lubridate und timeperiodsR)

Inhalt

Wenn Sie sich für Datenanalyse interessieren, insbesondere für die Programmiersprache R, könnten Ihnen meine telegram und youtube Kanäle gefallen. Der Großteil des Inhalts ist der Sprache R gewidmet.

  1. Arbeiten mit Daten im grundlegenden Syntax von R
    1.1. Text in Datum umwandeln
    1.2. Extrahieren von Datumsbestandteilen in grundlegendes R
  2. Arbeiten mit Daten mithilfe des Pakets lubridate
    2.1. Text in Datum umwandeln mit lubridate
    2.2. Extrahieren von Datumsbestandteilen mit dem Paket lubridate
    2.3. Arithmetische Operationen mit Daten
  3. Vereinfachte Arbeit mit Zeiträumen, Paket timeperiodsR
    3.1. Zeitintervalle in timeperiodsR
    3.2. Datumsvektorfilterung mithilfe von timeperiodsR
  4. Fazit

Arbeiten mit Daten im grundlegenden Syntax von R

Text in Datum umwandeln

In der Grundversion von R gibt es eine Reihe von Funktionen zur Arbeit mit Daten. Ein Nachteil der grundlegenden Syntax ist, dass die Groß- und Kleinschreibung der Namen und Argumente sehr inkonsistent ist und kaum eine logische Verbindung hat. Dennoch ist es wichtig, die grundlegenden Funktionen der Sprache zu kennen, weshalb wir genau damit beginnen werden.

Beim Laden von Daten in R, zum Beispiel aus CSV-Dateien oder anderen Quellen, erhalten Sie oft das Datum im Textformat. Um diesen Text in den richtigen Datentyp zu konvertieren, verwenden Sie die Funktion 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"

Standardmäßig as.Date() akzeptiert das Datum in zwei Formaten: JJJJ-MM-TT oder JJJJ/MM/TT.
Wenn Ihr Datensatz die Daten in einem anderen Format enthält, kann das Argument format.

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

format nimmt als Zeichenkette operativen Zeitintervalloperatoren und deren Format an. Die am häufigsten verwendeten Werte sind in der folgenden Tabelle aufgeführt:

Format
Beschreibung

%d
Tag des Monats (2-stellig)

%a
Abkürzung des Wochentags

%A
Vollständiger Name des Wochentags

%w
Tag der Woche (0-6, wobei 0 Sonntag ist)

%m
Zweiziffrige Monatsbezeichnung (01-12)

%b
Monatsabkürzung (apr, mar, …)

%B
Vollständiger Monatname

%y
Zweiziffrige Jahresbezeichnung

%Y
Vierstellige Jahresbezeichnung

%j
Tag des Jahres (001 — 366)

%U
Wochennummer im Jahr (00 — 53), Woche beginnt am Sonntag

%W
Wochennummer im Jahr (00 — 53), Woche beginnt am Montag

"September 26, 2019" ist somit — der vollständige Monatname, das Datum und das Jahr. Dieses Datumsformat kann man mit den folgenden Operatoren beschreiben:"%B %d, %Y".

Wobei:

  • %B — Vollständiger Monatname
  • %d — Tag des Monats
  • %Y — Vierstellige Jahresbezeichnung

Bei der Beschreibung des Datumsformats ist es wichtig, alle zusätzlichen Zeichen aus Ihrer Zeichenfolge einzuschließen, wie z. B. Bindestriche, Kommas, Punkte, Leerzeichen usw. In meinem Beispiel, "September 26, 2019", steht nach dem Datum ein Komma, und auch in der Beschreibung des Formats sollte ein Komma stehen:"%B %d, %Y".

Es gibt Situationen, in denen Sie ein Datum erhalten, das nicht nur nicht mit den Standardformaten übereinstimmt (JJJJ-MM-TT oder JJJJ/MM/TT), sondern auch in einer Sprache, die von der in Ihrem Betriebssystem festgelegten Standardsprache abweicht. Zum Beispiel haben Sie Daten hochgeladen, bei denen das Datum so angegeben ist: "15. Dezember 2019". Vor der Umwandlung dieser Zeichenfolge in ein Datum müssen Sie die Locale ändern.

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

Extrahieren von Datumsbestandteilen in grundlegendes R

In der Basisversion von R gibt es nicht so viele Funktionen, die es ermöglichen, einen Teil eines Datums aus einem Objekt der Klasse Date.

current_date <- Sys.Date() # aktuelles Datum
weekdays(current_date)     # Wochentag abrufen
months(current_date)       # Monatszahl im Jahr abrufen
quarters(current_date)     # Quartalsnummer im Jahr abrufen

Neben der Hauptklasse von Objekten Date gibt es in der Basisversion von R noch 2 Datentypen, die Zeitstempel speichern: POSIXlt, POSIXct. Der Hauptunterschied dieser Klassen zu Date besteht darin, dass sie zusätzlich zum Datum auch die Uhrzeit speichern.

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

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

# "POSIXct" "POSIXt"

Die Funktion Sys.time() gibt das aktuelle Datum und die Uhrzeit im Format zurück POSIXct. Dieses Format ähnelt dem UNIXTIME, und speichert die Anzahl der Sekunden seit Beginn der UNIX-Ära (Mitternacht (UTC) vom 31. Dezember 1969 bis 1. Januar 1970).

Klasse POSIXlt enthält auch Zeit und Datum sowie alle ihre Komponenten. Daher ist es ein Objekt mit einer komplexeren Struktur, aus dem jedoch jeder Komponenten von Datum und Uhrzeit leicht abgerufen werden kann, da es im Grunde POSIXlt dies 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  # часовой пояс

Die Umwandlung von numerischen und textuellen Daten in Formate POSIX* erfolgt durch die Funktionen as.POSIXct() und as.POSIXlt(). Diese Funktionen verfügen über eine begrenzte Anzahl von Argumenten.

  • x — Eine Zahl, eine Zeichenkette oder ein Objekt der Klasse Date, das umgewandelt werden soll;
  • tz — Die Zeitzone, standardmäßig "GMT";
  • format — Eine Beschreibung des Datumsformats, in dem die an das Argument x übergebenen Daten dargestellt werden;
  • origin — Wird nur bei der Umwandlung einer Zahl in POSIX verwendet, in dieses Argument muss ein Datum- und Zeitobjekt eingegeben werden, von dem die Sekunden gezählt werden. Wird normalerweise für die Umwandlung von UNIXTIME verwendet.

Wenn Ihre Daten zur Datum und Uhrzeit in UNIXTIME, dann verwenden Sie das folgende Beispiel zur Umwandlung in ein verständliches, lesbares Datum:

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

Im origin können Sie jeden Zeitstempel angeben. Zum Beispiel, wenn in Ihren Daten das Datum und die Uhrzeit als Anzahl der Sekunden ab dem 15. September 2019, 12:15 angegeben sind, verwenden Sie zur Umwandlung in ein Datum:

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

Arbeiten mit Daten mithilfe des Pakets lubridate

lubridate Der wahrscheinlich beliebteste Paket zur Arbeit mit Datumsangaben in der R-Sprache. Er bietet Ihnen zusätzlich drei Klassen.

  • durations – Zeitdauern, d.h. die Anzahl der Sekunden zwischen zwei Zeitstempeln;
  • periods – Zeiträume, die Berechnungen zwischen Daten in für Menschen verständlichen Intervallen wie Tagen, Monaten, Wochen usw. ermöglichen;
  • intervals – Objekte, die den Anfangs- und Endzeitpunkt bereitstellen.

Die Installation zusätzlicher Pakete in der R-Sprache erfolgt mit der Standardfunktion install.packages().

Paketinstallation lubridate:

install.packages("lubridate")

Text in Datum umwandeln mit lubridate

Funktionen des Pakets lubridate vereinfachen den Prozess der Umwandlung von Text in Datum erheblich und ermöglichen es Ihnen, beliebige arithmetische Operationen mit Daten und Zeiten durchzuführen.

Die aktuellen Daten oder das Datum und die Uhrzeit erhalten Sie mit den Funktionen today() und now().

today() # aktuelles Datum
now()   # aktuelles Datum und Uhrzeit

Um eine Zeichenfolge in ein Datum umzuwandeln, gibt es lubridate eine ganze Familie von Funktionen, deren Namen stets aus drei Buchstaben bestehen und die die Komponenten eines Datums darstellen:

  • y – Jahr
  • m – Monat
  • d – Tag

Liste der Funktionen zur Umwandlung von Text in Datum über lubridate

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

Einige Beispiele zur Umwandlung von Strings in Daten:

ymd("2017 jan 21")
mdy("20. März 2019")
dmy("1. April 2018")

Wie Sie sehen können lubridate erkennt es deutlich effektiver die Beschreibung von Daten in Textform und ermöglicht Ihnen, Text in ein Datum umzuwandeln, ohne zusätzliche Operatoren zur Formatbeschreibung verwenden zu müssen.

Extrahieren von Datumsbestandteilen mit dem Paket lubridate

Mit Hilfe von lubridate können Sie auch jeden Bestandteil eines Datums erhalten:

dt <- ymd("2017 jan 21")

year(dt)  # Jahr
month(dt) # Monat
mday(dt)  # Tag im Monat
yday(dt)  # Tag im Jahr
wday(dt)  # Wochentag

Arithmetische Operationen mit Daten

Aber die wichtigste und grundlegende Funktionalität lubridate besteht in der Möglichkeit, verschiedene arithmetische Operationen mit Daten durchzuführen.

Die Rundung eines Datums erfolgt durch drei Funktionen:

  • floor_date — Rundung auf die nächste vergangene Zeit
  • ceiling_date — Rundung auf die nächste zukünftige Zeit
  • round_date — Rundung auf die nächste Zeit

Jede dieser Funktionen hat ein Argument unit, mit dem Sie die Rundungseinheit angeben können: Sekunde, Minute, Stunde, Tag, Woche, Monat, bimonatlich, Quartal, Saison, Halbjahr, Jahr

dt <- ymd("2017 jan 21")

round_date(dt, unit = "month")    # auf den Monat runden
round_date(dt, unit = "3 month")  # auf 3 Monate runden
round_date(dt, unit = "quarter")  # auf das Quartal runden
round_date(dt, unit = "season")   # auf die Saison runden
round_date(dt, unit = "halfyear") # auf das Halbjahr runden

Lassen Sie uns also klären, wie Sie das Datum erhalten, das 8 Tage nach dem aktuellen Datum liegt, und verschiedene andere arithmetische Berechnungen zwischen zwei Daten durchführen.

today() + days(8)   # welches Datum ist in 8 Tagen
today() - months(2) # welches Datum war vor 2 Monaten
today() + weeks(12) # welches Datum ist in 12 Wochen
today() - years(2)  # welches Datum war vor 2 Jahren

Einfacher Umgang mit Zeiträumen, das Paket timeperiodsR.

timeperiodsR — ein neues Paket zur Arbeit mit Daten, das im September 2019 auf CRAN veröffentlicht wurde.

Paketinstallation timeperiodsR:

install.packages("timeperiodsR")

Der Hauptzweck ist die schnelle Bestimmung eines bestimmten Zeitraums relativ zu einem gegebenen Datum. Zum Beispiel können Sie mit seinen Funktionen leicht:

  • Die letzte Woche, den letzten Monat, das letzte Quartal oder Jahr in R erhalten.
  • Eine bestimmte Anzahl von Zeitintervallen relativ zu einem Datum erhalten, z.B. die letzten 4 Wochen.
  • Es ist einfach, die Komponenten des erhaltenen Zeitintervalls zu extrahieren: das Start- und Enddatum, die Anzahl der Tage im Intervall sowie die gesamte Sequenz der darin enthaltenen Daten.

Die Bezeichnungen aller Funktionen des Pakets timeperiodsR sind intuitiv verständlich und bestehen aus zwei Teilen: Richtung_Intervall, wobei:

  • Richtung das zu bewegende Intervall relativ zu einem bestimmten Datum angibt: last_n, previous, this, next, next_n.
  • Zeitlich Intervall zur Berechnung der Periode: Tag, Woche, Monat, Quartal, Jahr.

Vollständiger Funktionsumfang:

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

Zeitintervalle in timeperiodsR

Diese Funktionen sind nützlich, wenn Sie Berichte basierend auf Daten der letzten Woche oder des letzten Monats erstellen müssen. Um den letzten Monat zu erhalten, verwenden Sie die gleichnamige Funktion previous_month():

prmonth <- previous_month()

Nachfolgend haben Sie ein Objekt prmonth der Klasse tpr, aus dem sich leicht die folgenden Komponenten entnehmen lassen:

  • das Startdatum des Zeitraums, in unserem Beispiel der letzte Monat
  • das Enddatum des Zeitraums
  • die Anzahl der Tage, die im Zeitraum enthalten sind
  • die Sequenz der im Zeitraum enthaltenen Daten

Außerdem können Sie jeden der Komponenten auf verschiedene Weise erhalten:

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

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

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

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

Sie können auch jeden der Komponenten unter Verwendung des Arguments part, das in jeder der Funktionen des Pakets vorhanden ist. Mögliche Werte: start, end, sequence, length.

previous_month(part = "start")    # Anfang des Zeitraums
previous_month(part = "end")      # Ende des Zeitraums
previous_month(part = "sequence") # Datumsreihe
previous_month(part = "length")   # Anzahl der Tage im Zeitraum

Lassen Sie uns also alle Argumente betrachten, die in den Funktionen des Pakets verfügbar sind. timeperiodsR:

  • x — Stichtag, von dem aus der Zeitraum berechnet wird, standardmäßig das aktuelle Datum;
  • n — Anzahl der Intervalle, die in den Zeitraum eingehen, zum Beispiel 3 vorherige Wochen;
  • part — Welches Komponentenobjekt tpr benötigen Sie, standardmäßig all;
  • week_start — Dieses Argument ist nur in den Funktionen zur Arbeit mit Wochen vorhanden und ermöglicht es, die Nummer des Wochentags festzulegen, der als Wochenbeginn betrachtet wird. Standardmäßig ist Montag der Wochenbeginn, aber Sie können jeden Tag von 1 — Montag bis 7 — Sonntag festlegen.

Auf diese Weise können Sie jeden Zeitraum im Verhältnis zum aktuellen Datum oder zu einem anderen festgelegten Datum berechnen. Hier sind einige weitere Beispiele:

# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06", 
             n = 3, 
             week_start = 1)

 Zeitraum: vom 9. September 2019, Montag bis 29. September 2019, Sonntag

6. Oktober ist ein Sonntag:
Arbeiten mit Daten in R (grundlegende Funktionen sowie die Pakete lubridate und timeperiodsR)

Wir benötigen einen Zeitraum, der sich auf den 6. Oktober bezieht und die 3 vorhergehenden Wochen umfasst, jedoch die Woche ausschließt, die den 6. Oktober selbst beinhaltet. Folglich handelt es sich um den Zeitraum vom 9. bis 29. September.

Arbeiten mit Daten in R (grundlegende Funktionen sowie die Pakete lubridate und timeperiodsR)

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4)

 Zeitraum: vom 1. Mai 2019, Mittwoch bis 31. Mai 2019, Freitag

In diesem Beispiel interessiert uns der Monat, der vor 4 Monaten war, basierend auf dem 16. September 2019. Das war also Mai 2019.

Datumsvektorfilterung mithilfe von timeperiodsR

Für die Datumsfilterung in timeperiodsR gibt es mehrere Operatoren:

  • %left_out% — vergleicht zwei Objekte der Klasse tpr und gibt die Werte aus dem linken Objekt zurück, die im rechten fehlen.
  • %left_in% — vergleicht zwei Objekte der Klasse tpr und gibt die Daten aus dem linken Objekt zurück, die im rechten enthalten sind.
  • %right_out% — vergleicht zwei Objekte der Klasse tpr und gibt die Werte aus dem rechten zurück, die im linken fehlen.
  • %right_in% — vergleicht zwei Objekte der Klasse tpr und gibt die Daten aus dem rechten Objekt zurück, die im linken enthalten sind.

period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")

period1 %left_in% period2   # Holen Sie sich die Daten aus period1, die in period2 fallen
period1 %left_out% period2  # Holen Sie sich die Daten aus period1, die nicht in period2 fallen
period1 %right_in% period2  # Holen Sie sich die Daten aus period2, die in period1 fallen
period1 %right_out% period2 # Holen Sie sich die Daten aus period2, die nicht in period1 fallen

Das Paket timeperiodsR verfügt über ein offizielles, deutschsprachiges YouTube-Playlist.

Fazit

Wir haben die Klassen von Objekten, die in der Programmiersprache R für die Arbeit mit Daten vorgesehen sind, ausführlich untersucht. Außerdem wissen Sie jetzt, wie Sie arithmetische Operationen mit Daten durchführen können und schnell beliebige Zeiträume mit dem Paket abfragen können. timeperiodsR.

Wenn Sie sich für die Programmiersprache R interessieren, lade ich Sie ein, meinem Telegram-Kanal beizutreten R4marketing, in dem ich täglich nützliche Materialien über die Anwendung der Programmiersprache R zur Lösung meiner täglichen Aufgaben teile.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster