2015-05-15 4 views
7

ich eine ganze Spalte in meinem Dataset haben die vierstellige Jahreswerte hat, wie:Rechnen vierstellige Jahreszahlen auf ein Datum Typ

2001 2002 2002 2002 2003 2005 

Ich versuche, die vierstellige Jahreswert seit Typ zu konvertieren .

Der Code Ich verwende ist:

year <- as.Date(as.character(data_file$evtYear), format = "%Y") 

Aber der Ausgang ist:

"2001-05-15" "2002-05-15" "2002-05-15" "2002-05-15" "2003-05-15" "2005-05-15" 

Dies ist der falsche Ausgang geben. Es gibt zwei Jahreswerte an einem Datum (sowohl 2001 als auch 15).

Ich möchte nur die convert meines vierstelligen Jahr Teil von den Originaldaten zu ‚Jahr‘ in dem Datumstyp. Erwarteter Ausgang ist einfach:

2001 2002 2002 2002 2003 2005 

Aber ihre Klasse sollte vom Typ Datum sein.

Wie dies in R erreichen?

+2

'Datum' Typ in R ist immer eine Kombination aus Jahr, Monat und Tag (nicht unbedingt in dieser Reihenfolge). Sie können keinen Typ "Datum" mit nur dem Jahr haben. –

+0

@Pascal Also bedeutet das, dass ich keine vierstellige Zahl (2001) in meinen Daten haben kann, deren Klasse vom Datumstyp ist? – LearneR

+0

Sie können das nicht ohne den Monat und den Tag haben. BTW, warum brauchst du das in 'Date' Klasse mit nur Year? – akrun

Antwort

1

A lubridate Antwort:

library(lubridate) 
    year <- ymd(sprintf("%d-01-01",data_file$evtYear)) 
+0

Entschuldigung, das gab mir nicht die erwartete Ausgabe. Aber ich habe gerade aus den Kommentaren anderer gemerkt, dass meine erwartete Ausgabe keine gültige ist: einfach ein vierstelliger Jahreswert kann nicht vom Typ Date sein. Wie auch immer, vielen Dank für das Hinweis auf das lubridate-Paket. Werde mich darum kümmern, wenn die Zeit kommt. – LearneR

+1

Je nachdem, was Sie tun, kann es sinnvoll sein, das Datumsformat trotzdem zu verwenden und mit der lubridate-Bibliothek zu üben. Zum Beispiel, wenn Sie den Abstand zwischen Daten oder zwischen Daten berechnen müssen. Wenn Sie Daten analysieren, müssen Sie Daten und Zeiten manipulieren, da ein großer Prozentsatz der Daten datenbezogen ist. –

7

Basierend auf den Kommentaren es stellte sich heraus, dass die Person, die Frage zu stellen nicht ein numerisches Jahr "Date" Klasse ändern müssen; Dennoch ist die Frage, wie man es so macht, hier eine Antwort.

Hier sind ein paar Möglichkeiten, um ein "Date" Klasse-Objekt aus einem 4-stelligen Zahlen Jahr zu erstellen. Jegliche Nutzung as.Date:

yrs <- c(2001, 2002, 2002, 2002, 2003, 2005) 

1) isodate

as.Date(ISOdate(yrs, 1, 1)) # beginning of year 
as.Date(ISOdate(yrs, 12, 31)) # end of year 

Diese isodate Lösung ist ein bisschen schwierig, weil es ein Zwischen POSIXct Objekt schafft so die Zeitzone Probleme existieren könnten. Vielleicht bevorzugen Sie eines der folgenden.

2) einfügen

as.Date(paste(yrs, 1, 1, sep = "-")) # beginning of year 
as.Date(paste(yrs, 12, 31, sep = "-")) # end of year 

3) Zoo :: as.yearmon

library(zoo) 

as.Date(as.yearmon(yrs)) # beginning of year 
as.Date(as.yearmon(yrs) + 11/12, frac = 1) # end of year 

Hinweis: Wenn y das Ergebnis für eine der oben genannten ist dann format(y, "%Y") gibt das Zeichen Jahr und as.numeric(format(y, "%Y")) gibt das numerische Jahr.

0

können Sie tun:

library(lubridate) 
yrs <- c(2001, 2002, 2002, 2002, 2003, 2005) 
yr <- as.Date(as.character(yrs), format = "%Y") 
y <- year(yr) 

Ausgang:

2001 2002 2002 2002 2003 2005 
+0

'lubridate :: year()' gibt das Jahr-Element eines Datum-Zeit-Objekts als Dezimalzahl zurück. Also ist "y" identisch mit "yrs". Ein gültiges Datum identifiziert immer einen bestimmten Tag, z. B. durch Angabe von Jahr, Monat und Datum. 'help (" as.Date ")' sagt: * Wenn die Datumszeichenfolge das Datum nicht vollständig angibt, kann die zurückgegebene Antwort systemspezifisch sein. Das häufigste Verhalten ist die Annahme, dass ein fehlendes Jahr, ein fehlender Monat oder ein fehlender Tag der aktuelle ist. * Das Ergebnis hängt also davon ab, wann die Anweisung ausgeführt wird und zu zufälligen Ergebnissen führt. ZB auf meinem System (zum Zeitpunkt des Schreibens) ist "Jahr" 2001-01-28, usw. – Uwe

0

Wie bereits von der OP erkannt, geschweige denn ein Jahr bilden kein gültiges Datum, weil Monat und Tag sind nicht angegeben.

jedoch einige Datum und Datum-Zeit-Umwandlungsfunktionen, zB ymd(), parse_date_time() im lubridate Paket erkennen einen Parameter truncated für das Parsen von unvollständigen Daten zu ermöglichen:

yrs <- c(2001, 2002, 2002, 2002, 2003, 2005) 
lubridate::ymd(yrs, truncated = 2L) 
[1] "2001-01-01" "2002-01-01" "2002-01-01" "2002-01-01" "2003-01-01" "2005-01-01" 

Die Jahre wurden bis zum 1. Januar abgeschlossen, um ein gültiges Datum zu erhalten. Das Ergebnis ist der Klasse Date.

Verwandte Themen