2015-11-12 4 views
7

Ich habe einen Datenrahmen in dem Zeitpunkt als double gespeichert wird beispielsweise 1993.09 1993.10 1993.11 1993.12as.Date von ‚YYYY.mm‘ Format

Ich mag diese in ein Datumsformat konvertieren (mit Tagen immer 1).

Soweit ich es verstehe, as.Date() möchte eine Zeichenfolge eingeben. Aus irgendeinem Grund, wenn ich meine Daten in die Zeichenfolge sapply(dates, as.character) umwandle, verschwinden die Nullen nach denen, wodurch Oktober in Januar konvertiert wird, was zu zwei Januaries pro Jahr führt.

dates 
1993.07 1993.08 1993.09 1993.10 1993.11 1993.12 
sapply(dates, as.character) 
sub("[.]", " ", dates) 
"1993 07" "1993 08" "1993 09" "1993 1" "1993 11" "1993 12" 

Gibt es eine einfachere Möglichkeit, die Daten zu konvertieren? Oder wo vermassle ich?

dput:

c(1993.01, 1993.02, 1993.03, 1993.04, 1993.05, 1993.06, 1993.07, 
1993.08, 1993.09, 1993.1, 1993.11, 1993.12) 

Antwort

9

Ihr Problem ist ein ziemlich großer Nachteil ist, dass Sie etwas haben, das eine Zeichenfolge ist, aber sieht aus wie eine numerische und ihr habt nicht um diese während des Imports. R unterscheidet nicht zwischen 1993.1 und 1993.10. Beide sind die gleiche Nummer. Somit gibt as.character(1993.10)"1993.1" zurück. Sie müssen eine Formatierungsfunktion verwenden, um sicherzustellen, dass Sie nach dem Zeitraum zwei Ziffern erhalten, da zu as.Date"1993.1" und "1993.01" der gleiche Monat sind.

x <- c(1993.09, 1993.10, 1993.11, 1993.12) 
as.Date(sprintf("%.2f.01", x), format = "%Y.%m.%d") 
#[1] "1993-09-01" "1993-10-01" "1993-11-01" "1993-12-01" 

Natürlich x sollte als ein Zeichen zu beginnen importiert werden.

+0

Die 'dput' ist' x <- c (1993,09, 1993,1, 1993,11, 1993,12) 'aber Ihre Lösungen noch funktioniert. –

+0

@DavidArenburg R ist es egal, wenn Sie es '1993.1' oder' 1993.10' geben. Das ist ein identisches Doppel. – Roland

2

Verwenden paste0 in den Tag hinzuzufügen und die Werte für Datumsformatierung von ?strptime Nachschlag. Wenn Sie Probleme mit dem Doppel bespannen Formatierung haben, könnten Sie formatC verwenden:

txtfield <- c(1993.01, 1993.02, 1993.03, 1993.04, 1993.05, 1993.06, 1993.07, 
    1993.08, 1993.09, 1993.1, 1993.11, 1993.12) 

as.Date(paste0(formatC(txtfield, digits=2, format="f"),".01"), "%Y.%m.%d") 

Erläuterung:

paste0 eine Kurzversion paste ist, die Zwischenräume zwischen den eingefügten Elemente nicht einfügen.
in formatC, digits gibt die Anzahl der Ziffern nach der Dezimalzahl (in unserem Fall wollen wir 2. Format sagt R, welche Nummer Formatierung zu verwenden, in unserem Fall "f" gibt die Zahlen Zahlen in der gewünschten xxx.xxx format
as.Date konvertiert in ein natives R-Datumsformat, wobei "% Y.% m.% d" das ganze Jahr (4 Ziffern) gefolgt von einem Punkt gefolgt von einem numerischen Monat (2 Ziffern) gefolgt von einem Punkt angibt. ., gefolgt von numerischen Tag

Ergebnisse:

[1] "1993-01-01" "1993-02-01" "1993-03-01" "1993-04-01" "1993-05-01" "1993-06-01" 
[7] "1993-07-01" "1993-08-01" "1993-09-01" "1993-10-01" "1993-11-01" "1993-12-01" 
0

Sie benötigen einige Hantieren mit str zu tun iings. Der naheliegendste Weg (zu mir *) wäre, die rechte Seite der Werte mit Nullen zu "füllen".

* die

dates <- c(1993.01, 1993.02, 1993.03, 1993.04, 1993.05, 1993.06, 1993.07, 
1993.08, 1993.09, 1993.10, 1993.11, 1993.12) 

library(magrittr) 
library(stringr) 
dates %<>% 
    str_pad(width = 7, side = "right", pad = "0") %>% 
    paste0(".01") %>% 
    as.Date(format = "%Y.%m.%d") 

dates 
6

Wenn Sie wirklich wollen nur in "Date" Klasse mit dem ersten des Monats zu konvertieren, dann scheint Roland Lösung am direktesten, aber es gibt einige andere Überlegungen wie, ob Sie Ende des Monats oder ob Sie wirklich verwenden möchten wollen Jahresmonate mit Datumsangaben darstellen.

Das Zoo-Paket hat eine "yearmon" Klasse, die direkt ganz Monate darstellen kann, ohne sie zu Daten konvertieren und hat auch die as.Date.yearmon Verfahren, das ein frac= Argument hat, kann verwendet werden, um den Anteil des Weges durch den Monat angeben, zu konvertieren wenn Sie wollen "Date" Klasse.

Stellen Sie zuerst sicher, dass die Daten Zeichenfolgen sind. Die Eingabe in der Frage zeigt 1993.10 als eine der Eingaben an, so dass wir sicherstellen müssen, dass es eine abschließende Null gibt. (Wenn die Eingaben bereits Zeichen mit der abschließenden Null sind, dann ist das kein Problem. Wir haben hier den schlimmsten Fall angenommen, vorausgesetzt, dass wir sie explizit in Zeichenfolgen mit einer abschließenden 0 konvertieren müssen.) Verwenden Sie jetzt as.yearmon mit Format "%Y.%m". Schließlich verwenden Sie as.Date.yearmon, um zu "Date" Klasse zu konvertieren.

Vielleicht der größte Vorteil dieses Ansatzes besteht darin, dass wir nur das Ergebnis in "yearmon" Klasse verlassen konnten (dh lassen Sie den "as.Date" Teil, zB as.yearmon(sprintf("%.2f", dates)) oder wenn die Daten bereits Zeichenkette, dates.ch, mit einer Hinter 0 im Fall von "1993.10" dann nur as.yearmon(dates.ch, "%Y.%m"), was wirklich darzustellen, was Sie besser haben seit dem Tag nicht wirklich sinnvoll ist, da es nicht von Anfang an dabei war. "yearmon" Objekte aufgetragen und in der erwarteten Art und Weise sortiert werden können.

Hier ist die Umstellung auf "Date" Klasse mit "yearmon":

library(zoo) 

dates <- c(1993.07, 1993.08, 1993.09, 1993.1, 1993.11, 1993.12) # test input 


as.Date(as.yearmon(sprintf("%.2f", dates), "%Y.%m")) # 1st of month 
## [1] "1993-07-01" "1993-08-01" "1993-09-01" "1993-10-01" "1993-11-01" "1993-12-01" 

as.Date(as.yearmon(sprintf("%.2f", dates), "%Y.%m"), frac = 1) # last of month 
## [1] "1993-07-31" "1993-08-31" "1993-09-30" "1993-10-31" "1993-11-30" "1993-12-31" 

oder wenn der Testeingang wie folgt aussieht:

dates.ch <- c("1993.07", "1993.08", "1993.09", "1993.10", "1993.11", "1993.12") # input 

as.Date(as.yearmon(dates.ch, "%Y.%m")) 

as.Date(as.yearmon(dates.ch, "%Y.%m"), frac = 1) 
+2

OK. Habe es behoben. –

+0

Haben Sie eine Verbesserung für den letzten Tag des Monats Lösung. – Roland

+0

Ich habe eine Dankesrede von mir, weil ich mich an das Zoo-Paket erinnert habe, das habe ich vergessen! –

Verwandte Themen