Arbeiten mit Daten im R (Basisfunktionen sowie die Pakete lubridate und timeperiodsR)

Das aktuelle Datum in jeder Programmiersprache zu erhalten, ist eine Operation, die "Hallo Welt!" entspricht. Die Sprache R ist da keine Ausnahme.

In diesem Artikel werden wir untersuchen, wie die Arbeit mit Daten im grundlegenden Syntax der Sprache R funktioniert, und wir werden einige nützliche Pakete betrachten, die ihre Möglichkeiten bei der Arbeit mit Daten erweitern:

  • lubridate — ein Paket, das es ermöglicht, arithmetische Berechnungen zwischen Daten durchzuführen;
  • timeperiodsR — ein Paket zur Arbeit mit Zeitintervallen und deren Komponenten.

Arbeiten mit Daten im R (Basisfunktionen sowie die Pakete lubridate und timeperiodsR)

Inhalt

Wenn Sie an Datenanalyse interessiert sind, insbesondere an der Sprache R, könnten Sie an meinen Telegram und youtube Kanäle. Ein großer 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 Datumskomponenten im grundlegenden R
  2. Arbeiten mit Daten mit dem Paket 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. Filtern eines Datumsvektors mit Hilfe von timeperiodsR
  4. Fazit

Arbeiten mit Daten im grundlegenden Syntax von R

Text in Datum umwandeln

In der grundlegenden R-Syntax gibt es eine Reihe von Funktionen zur Arbeit mit Daten. Der Nachteil der grundlegenden Syntax liegt darin, dass die Groß- und Kleinschreibung von Namen und Argumenten sehr uneinheitlich ist und kaum eine logische Verbindung besteht. Dennoch ist es wichtig, die grundlegenden Funktionen der Sprache zu kennen, daher beginnen wir genau damit.

Bei der Datenaufnahme in R, aus csv-Dateien oder anderen Quellen, erhalten Sie häufig das Datum im Textformat. Um diesen Text in den richtigen Datentyp zu überführen, 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() die das Datum in zwei Formaten akzeptiert: JJJJ-MM-TT oder JJJJ/MM/TT.
Wenn in Ihrem Datensatz die Daten in einem anderen Format vorliegen, können Sie das Argument verwenden, um die Umwandlung zu bewerkstelligen. format.

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

format nimmt als Zeichenkette Operatoren entgegen, die einen bestimmten Zeitintervall und dessen Format bezeichnen; die am häufigsten verwendeten Werte sind in der folgenden Tabelle aufgeführt:

Format
Beschreibung

%d
Nummer des Tages im Monat

%a
Abkürzung für den Wochentag

%A
Vollständiger Name des Wochentags

%w
Nummer des Wochentags (0-6, wobei 0 Sonntag ist)

%m
Zweiziffrige Bezeichnung des Monats (01-12)

%b
Abkürzung des Monatsnamens (apr, mar, …)

%B
Vollständiger Monatsname

%y
Zweiziffrige Bezeichnung des Jahres

%Y
Vierstellige Bezeichnung des Jahres

%j
Nummer des Tages im Jahr (001 – 366)

%U
Nummer der Woche im Jahr (00 – 53), Beginn der Woche ist Sonntag

%W
Wochennummer im Jahr (00 — 53), Beginn der Woche Montag

Entsprechend ist "26. September 2019" der vollständige Name des Monats, der Tag und das Jahr. Dieses Datumsformat kann mit den folgenden Operatoren beschrieben werden:"%B %d, %Y".

Wo:

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

Bei der Beschreibung des Datumsformats ist es wichtig, alle zusätzlichen Zeichen aus Ihrer Zeichenfolge einzubeziehen, wie Bindestriche, Kommas, Punkte, Leerzeichen und so weiter. In meinem Beispiel "26. September 2019" steht nach dem Datum ein Komma, und auch im Formatbeschreibung muss ein Komma gesetzt werden:"%B %d, %Y".

Es gibt Situationen, in denen Sie ein Datum erhalten, das nicht nur von den Standardformaten abweicht (JJJJ-MM-TT oder JJJJ/MM/TT), sondern auch in einer Sprache verfasst ist, die von der in Ihrem Betriebssystem standardmäßig eingestellten Sprache abweicht. Zum Beispiel haben Sie Daten hochgeladen, bei denen das Datum in folgender Form 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 Datumskomponenten im grundlegenden R

In Basis-R gibt es nicht viele Funktionen, die es ermöglichen, einen Teil des Datums aus einem Objekt der Klasse Date.

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

Neben der Hauptklasse von Objekten Date gibt es in Basis-R noch zwei Datentypen, die Zeitstempel speichern: POSIXlt, POSIXct. Der Hauptunterschied dieser Klassen besteht darin, dass sie neben dem Datum auch die Zeit speichern. Date Sys.time()

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

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

# "POSIXct" "POSIXt"

Funktion gibt das aktuelle Datum und die aktuelle Uhrzeit im Format zurück . Dieses Format ist in seiner Bedeutung ähnlich wie POSIXctUNIXTIME , und speichert die Anzahl der Sekunden seit Beginn der UNIX-Ära(Mitternacht (UTC) vom 31. Dezember 1969 bis zum 1. Januar 1970) und speichert ebenfalls Zeit und Datum sowie deren Komponenten. Daher handelt es sich um ein Objekt mit einer komplexeren Struktur, aus dem jedoch leicht jede Komponente von Datum und Zeit extrahiert werden kann, da es im Grunde genommen.

Klasse POSIXlt list POSIXlt dieses die Umwandlung von numerischen und textuellen Daten in die Formate.

# Получаем текущую дату и время
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* geschieht durch die Funktionen as.POSIXct() as.POSIXlt() und . Diese Funktionen haben einen kleinen Satz an Argumenten.x — Zahl, Zeichenfolge oder Objekt der Klasse

  • , das umgewandelt werden soll; Datetz — Zeitzone, standardmäßig "GMT";
  • format — Beschreibung des Datumsformats, in dem die Daten übergeben werden, die im Argument x enthalten sind;
  • Format — Beschreibung des Datumsformat, in dem die übergebenen Daten im Argument x dargestellt werden;
  • origin — Wird nur bei der Konvertierung von Zahlen in POSIX verwendet. In dieses Argument muss ein Datum- und Uhrzeit-Objekt übergeben werden, von dem aus die Sekunden gezählt werden. In der Regel wird es zur Umwandlung von UNIXTIME verwendet.

Wenn Ihre Daten zu Datum und Uhrzeit in , und speichert die Anzahl der Sekunden seit Beginn der UNIX-Äravorliegen, verwenden Sie das folgende Beispiel, um sie in ein verständliches, lesbares Datum zu konvertieren:

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

In origin können Sie einen beliebigen Zeitstempel angeben. Wenn in Ihren Daten beispielsweise das Datum und die Uhrzeit als Anzahl der Sekunden ab dem 15. September 2019 um 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 mit dem Paket lubridate

lubridate wahrscheinlich das beliebteste Paket zur Arbeit mit Daten in R. Es bietet Ihnen zusätzlich noch drei Klassen.

  • durations — die Dauer, also die Anzahl der Sekunden zwischen zwei Zeitstempeln;
  • periods — Perioden ermöglichen Berechnungen zwischen Daten in für den Menschen verständlichen Intervallen: Tagen, Monaten, Wochen und so weiter;
  • intervals — Objekte, die den Anfangs- und Endzeitpunkt bereitstellen.

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

Paketinstallation lubridate:

install.packages("lubridate")

Text in Datum umwandeln mit lubridate

Die Funktionen des Pakets lubridate machen den Prozess der Umwandlung von Text in Datum erheblich einfacher und ermöglichen es Ihnen außerdem, beliebige arithmetische Operationen mit Datum und Uhrzeit durchzuführen.

Um das aktuelle Datum oder Datum und Uhrzeit zu erhalten, helfen Ihnen die Funktionen today() und now().

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

Um einen String in ein Datum zu konvertieren, gibt es in lubridate eine ganze Familie von Funktionen, deren Namen immer aus drei Buchstaben bestehen und die die Reihenfolge der Datumskomponenten darstellen:

  • y — Jahr
  • m — Monat
  • d — Tag

Liste der Funktionen zur Umwandlung von Text in Datum mit 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, lubridate erkennt es deutlich effektiver die Beschreibung von Daten in Form von Text und ermöglicht es Ihnen, Text in ein Datum umzuwandeln, ohne zusätzliche Operatoren zur Beschreibung des Formats zu verwenden.

Extrahieren von Datumsbestandteilen mit dem Paket lubridate

Außerdem kann man mit lubridate jeden Bestandteil aus einem Datum 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 liegt in der Möglichkeit, verschiedene arithmetische Operationen mit Daten durchzuführen.

Die Rundung des Datums erfolgt durch drei Funktionen:

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

Jede dieser Funktionen hat ein Argument Unit, mit dem Sie die Rundungseinheit angeben können: second, minute, hour, day, week, month, bimonth, quarter, season, halfyear, year

dt <- ymd("2017 jan 21")

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

Lassen Sie uns also herausfinden, wie wir ein 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 wird in 8 Tagen sein
today() - months(2) # welches Datum war vor 2 Monaten
today() + weeks(12) # welches Datum wird in 12 Wochen sein
today() - years(2)  # welches Datum war vor 2 Jahren

Vereinfachte Arbeit 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")

Die Hauptfunktion besteht darin, schnell einen bestimmten Zeitraum relativ zu einem gegebenen Datum zu bestimmen. Beispielsweise können Sie mit seinen Funktionen leicht:

  • Die letzte Woche, den letzten Monat, das letzte Quartal oder das letzte Jahr in R erhalten.
  • Eine bestimmte Anzahl von Zeiträumen relativ zu einem Datum erhalten, zum Beispiel die letzten 4 Wochen.
  • Einfach die Komponenten des erhaltenen Zeitraums extrahieren: das Anfangs- und Enddatum, die Anzahl der Tage, die in den Zeitraum fallen, sowie die gesamte Folge von Daten, die darin enthalten sind.

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

  • Richtung in dem man sich relativ zu einem gegebenen Datum bewegen muss: last_n, previous, this, next, next_n.
  • zeitlich Intervall zur Berechnung des Zeitraums: day, week, month, quarter, year.

Der vollständige Satz von Funktionen:

  • 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 in Fällen, in denen Sie Berichte auf der Grundlage von Daten aus der letzten Woche oder dem letzten Monat erstellen müssen. Um den letzten Monat zu erhalten, verwenden Sie die gleichnamige Funktion previous_month():

prmonth <- previous_month()

Nach dem wird Ihnen das Objekt zur Verfügung stehen prmonth Klasse tpr, aus dem Sie leicht die folgenden Komponenten erhalten können:

  • das Startdatum des Zeitraums, in unserem Beispiel ist das der letzte Monat
  • das Enddatum des Zeitraums
  • die Anzahl der Tage im Zeitraum
  • die Reihenfolge der Tage im Zeitraum

Dabei können Sie jede der Komponenten auf verschiedene Arten erhalten:

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

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

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

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

Sie können auch jede der Komponenten mithilfe des Arguments part, das in jeder Funktion des Pakets vorhanden ist. Mögliche Werte: start, end, sequence, length.

previous_month(part = "start")    # Startdatum des Zeitraums
previous_month(part = "end")      # Enddatum des Zeitraums
previous_month(part = "sequence") # Reihenfolge der Tage
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 — Referenzdatum, von dem der Zeitraum berechnet wird, standardmäßig das aktuelle Datum;
  • n — Anzahl der Intervalle, die in den Zeitraum einfließen, zum Beispiel die letzten 3 Wochen;
  • part — Welchen Bestandteil des Objekts tpr müssen Sie erhalten, standardmäßig all;
  • week_start — Dieser Parameter ist nur in den Funktionen zur Arbeit mit Wochen enthalten und ermöglicht es, die Nummer des Wochentags anzugeben, die als Beginn der Woche betrachtet wird, standardmäßig ist Montag der Beginn der Woche, aber Sie können jeden Tag von 1 – Montag bis 7 – Sonntag angeben.

Somit können Sie jeden Zeitraum relativ zu einem aktuellen oder einem anderen angegebenen Datum berechnen, hier sind noch einige 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 im R (Basisfunktionen sowie die Pakete lubridate und timeperiodsR)

Wir benötigen einen Zeitraum, der 3 Wochen vor dem 6. Oktober liegt, ohne die Woche, in die der 6. Oktober fällt. Das ist also der Zeitraum vom 9. bis 29. September.

Arbeiten mit Daten im R (Basisfunktionen 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, wenn wir vom 16. September 2019 ausgehen, war das also Mai 2019.

Filtern eines Datumsvektors mit Hilfe von timeperiodsR

Für die Filterung von Daten in timeperiodsR gibt es mehrere Operatoren:

  • %left_out% — vergleicht zwei Objekte der Klasse tpr und gibt Werte aus dem linken 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 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 vorhanden sind.

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

period1 %left_in% period2   # Daten aus period1, die in period2 enthalten sind, abrufen
period1 %left_out% period2  # Daten aus period1, die nicht in period2 enthalten sind, abrufen
period1 %right_in% period2  # Daten aus period2, die in period1 enthalten sind, abrufen
period1 %right_out% period2 # Daten aus period2, die nicht in period1 enthalten sind, abrufen

Das Paket timeperiodsR hat eine offizielle, russischsprachige YouTube-Wiedergabeliste.

Fazit

Wir haben die Klassen von Objekten im R, die für die Arbeit mit Daten vorgesehen sind, ausführlich besprochen. Außerdem wissen Sie jetzt, wie man mit Daten arithmetische Operationen durchführt und schnell beliebige Zeiträume mit dem Paket timeperiodsR.

Wenn Sie an der Programmiersprache R interessiert sind, lade ich Sie ein, meinem Telegram-Kanal zu folgen. R4marketing, in dem ich täglich nützliche Materialien über die Anwendung der Programmiersprache R zur Lösung meiner alltäglichen Aufgaben teile.

Quelle: habr.com

60GB SSD 8Gb DDR4