Jahr vom Datum extrahieren


79

Wie kann ich die ersten Elemente aus einer Variablen entfernen, insbesondere wenn diese Variable Sonderzeichen enthält? Zum Beispiel habe ich die folgende Spalte:

Date
01/01/2009
01/01/2010
01/01/2011
01/01/2012

Ich brauche eine neue Spalte wie die folgende:

Date
2009
2010
2011
2012

13
In die Klasse 'Datum' konvertieren und formatdas 'Jahr' extrahieren
akrun

5
odergsub(".*/","",df$Date)
mtoto

2
odersubstr(as.character(....), 7, 10)
Jogo

6
lubridate::yearsollte auch den Trick machen, wenn die Daten im 'Date'-Format vorliegen, wie von @akrun vorgeschlagen.
fdetsch

6
Die sauberste Lösung besteht darin, diese Variable zu erzwingen Dateund eine formatoder andere Funktionen zu verwenden, um Teile davon zu extrahieren. Zum Beispiel x <- as.Date("01/01/2009", format = "%m/%d/%Y"); lubridate::year(x).
Roman Luštrik

Antworten:


20

Wenn alle Ihre Daten dieselbe Breite haben, können Sie die Daten in einen Vektor einfügen und Teilzeichenfolgen verwenden

Date
a <- c("01/01/2009", "01/01/2010" , "01/01/2011")
substring(a,7,10) #This takes string and only keeps the characters beginning in position 7 to position 10

Ausgabe

[1] "2009" "2010" "2011"

Ich stimme zu, aber Sie können dies leicht in einen numerischen Vektor umwandeln, nicht wahr? as.numeric(substring(a,7,10))
Fabian Habersack

3
Daten sollten nicht in Zeichenfolgen oder Zahlen umgewandelt werden. Sie sind von Natur aus eine 'Anzahl von x (Sekunden) seit einem festen Zeitpunkt' und werden als lesbare Zeichenfolgen angezeigt - streng genommen nicht als Zeichenfolgen zu manipulieren.
Skoh

173

Wie in den Kommentaren erläutert, kann dies erreicht werden, indem der Eintrag in ein DateFormat konvertiert und das Jahr extrahiert wird, beispielsweise wie folgt:

format(as.Date(df1$Date, format="%d/%m/%Y"),"%Y")

7
Warum zum Teufel funktioniert das? Wenn ich mir format()die Dokumentation ansehe, wird nichts über das zweite Argument gesagt, das Sie angegeben haben. Wie soll ich das verstehen?
Narbengesicht

16
Von ?format: "Format ist eine generische Funktion . Neben den hier beschriebenen Methoden gibt es Methoden für Datumsangaben ( siehe format.Date )". From ?format.Date: "## S3-Methode für das Format 'Date' (x, ...) [wobei ... bezeichnet] weitere Argumente, die von oder an andere Methoden übergeben werden sollen, einschließlich des Formats für die Methoden as.character und as.Date . ". Siehe auch das erste Beispiel in ?format.Date.
RHertel


27

Wenn Sie Ihre Variable konvertieren in Date:

date <-  as.Date('10/30/2018','%m/%d/%Y')

Sie können dann die gewünschten Elemente ausschneiden und neue Variablen erstellen, z. B. Jahr:

year <- as.numeric(format(date,'%Y'))

oder Monat:

month <- as.numeric(format(date,'%m'))

3

Dies ist mehr ein Rat als eine bestimmte Antwort, aber mein Vorschlag ist, Datumsangaben sofort in Datumsvariablen umzuwandeln, anstatt sie als Zeichenfolgen beizubehalten. Auf diese Weise können Sie Datums- (und Uhrzeit-) Funktionen verwenden, anstatt zu versuchen, sehr problematische Problemumgehungen zu verwenden.

Wie bereits erwähnt, verfügt das Schmiermittelpaket über schöne Extraktionsfunktionen.

Bei einigen Projekten habe ich festgestellt, dass das Zusammensetzen von Daten von Anfang an hilfreich ist: Erstellen Sie zunächst Variablen für Jahr, Monat, Tag (des Monats) und Tag (der Woche). Dies kann Zusammenfassungen, Tabellen und Grafiken vereinfachen, da der Extraktionscode vom Zusammenfassungs- / Tabellen- / Grafikcode getrennt ist und Sie diese Änderungen nicht an mehreren Stellen einführen müssen, wenn Sie sie ändern müssen.


2

Wenn Sie das datePaket verwenden , kann dies ziemlich einfach durchgeführt werden.

library(date)
Date <- c("01/01/2009", "01/01/2010", "01/01/2011", "01/01/2012")
Date <- as.date(Date)
Date
# [1] 1Jan2009 1Jan2010 1Jan2011 1Jan2012
date.mdy(Date)$year
# [1] 2009 2010 2011 2012

## be aware that these are now integers and thus different methods may be invoked:
str(date.mdy(Date)$year)
# int [1:4] 2009 2010 2011 2012
summary(Date)
#     First      Last   
# "1Jan2009" "1Jan2012" 
summary(date.mdy(Date)$year)
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#    2009    2010    2010    2010    2011    2012 

0

Seit einiger Zeit können Sie sich auch nur auf das data.tablePaket und seine IDateKlasse sowie die zugehörigen Funktionen verlassen (Check ?as.IDate()). Sie müssen also nicht zusätzlich installieren lubridate.

require(data.table)

a <- c("01/01/2009", "01/01/2010" , "01/01/2011")
year(as.IDate(a, '%d/%m/%Y')) # all data.table functions
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.