Jahr und Monat (Format “JJJJ-MM”) in ein Datum umwandeln?

Ich habe einen Datensatz, der so aussieht:

Month count 2009-01 12 2009-02 310 2009-03 2379 2009-04 234 2009-05 14 2009-08 1 2009-09 34 2009-10 2386 

Ich möchte die Daten grafisch darstellen (Monate als x Werte und zählt als y Werte). Da es Lücken in den Daten gibt, möchte ich die Informationen für den Monat in ein Datum umwandeln. Ich habe es versucht:

 as.Date("2009-03", "%Y-%m") 

Aber es hat nicht funktioniert. Was ist los mit dir? Es scheint, dass as.Date () auch einen Tag benötigt und nicht in der Lage ist, einen Standardwert für den Tag zu setzen? Welche function triggers mein Problem?

    Versuche dies. (Hier verwenden wir text=Lines , um das Beispiel in sich zu behalten, aber in Wirklichkeit würden wir es durch den Dateinamen ersetzen.)

     Lines < - "2009-01 12 2009-02 310 2009-03 2379 2009-04 234 2009-05 14 2009-08 1 2009-09 34 2009-10 2386" library(zoo) z <- read.zoo(text = Lines, FUN = as.yearmon) plot(z) 

    Die X-Achse ist mit diesen Daten nicht so schön, aber wenn Sie mehr Daten in der Realität haben, könnte es in Ordnung sein, oder Sie können den Code für eine ausgefallene X-Achse verwenden, die im Beispielteil von ?plot.zoo .

    Die Zoo-Serie, z , die oben erstellt wurde, hat einen "yearmon" Zeitindex und sieht so aus:

     > z Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Aug 2009 Sep 2009 Oct 2009 12 310 2379 234 14 1 34 2386 

    "yearmon" kann auch alleine benutzt werden:

     > as.yearmon("2000-03") [1] "Mar 2000" 

    Hinweis:

    1. "yearmon" sortieren in Kalenderreihenfolge.

    2. Dies wird die monatlichen Punkte in gleichmäßig beabstandeten Intervallen darstellen, was wahrscheinlich ist, was gewünscht wird; Wenn es jedoch gewünscht wäre, die Punkte in ungleichmäßig beabstandeten Intervallen zu zeichnen, die proportional zur Anzahl der Tage in jedem Monat beabstandet sind, dann wandle den Index von z in "Date" : time(z) < - as.Date(time(z)) .

    Da Datumsangaben einem numerischen Wert und einem Anfangsdatum entsprechen, brauchen Sie tatsächlich den Tag. Wenn Sie wirklich möchten, dass Ihre Daten im Datumsformat vorliegen, können Sie den Tag einfach manuell auf den Ersten jedes Monats fixieren, indem Sie ihn auf das Datum einfügen:

     month < - "2009-03" as.Date(paste(month,"-01",sep="")) 

    Die kompakteste Lösung, wenn Sie die Daten im Datumsformat benötigen:

     library(zoo) month < - "2000-03" as.Date(as.yearmon(month)) [1] "2000-03-01" 

    as.Date wird den ersten Tag eines jeden Monats an ein Jahrmonsterobjekt für Sie anpassen.

    Verwenden Sie jederzeit Paket:

     library(anytime) anydate("2009-01") # [1] "2009-01-01" 

    Sie können dies auch mit den functionen parse_date_time oder fast_strptime aus dem lubridate :

     > parse_date_time(dates1, "ym") [1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC" > fast_strptime(dates1, "%Y-%m") [1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC" 

    Der Unterschied zwischen diesen beiden ist, dass parse_date_time eine lubridate-ähnliche parse_date_time zulässt, während fast_strptime die gleiche Formatangabe wie strptime .

    Zur Angabe der Zeitzone können Sie den tz Parameter verwenden:

     > parse_date_time(dates1, "ym", tz = "CET") [1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET" 

    Wenn Unregelmäßigkeiten in Ihren Datums- und Uhrzeitdaten auftreten, können Sie den truncated Parameter verwenden, um anzugeben, wie viele Unregelmäßigkeiten zulässig sind:

     > parse_date_time(dates2, "ymdHMS", truncated = 3) [1] "2012-06-01 12:23:00 UTC" "2012-06-01 12:00:00 UTC" "2012-06-01 00:00:00 UTC" 

    Verwendete Daten:

     dates1 < - c("2009-01","2009-02","2009-03") dates2 <- c("2012-06-01 12:23","2012-06-01 12",'2012-06-01") 

    In der Tat, wie oben erwähnt (und an anderer Stelle auf SO), um die Zeichenfolge in ein Datum zu konvertieren, benötigen Sie ein bestimmtes Datum des Monats. Aus der as.Date() Handbuchseite:

    Wenn die Datumszeichenfolge das Datum nicht vollständig angibt, kann die zurückgegebene Antwort systemspezifisch sein. Am häufigsten wird angenommen, dass ein fehlendes Jahr, ein fehlender Monat oder ein fehlender Tag der aktuelle ist. Wenn es ein Datum falsch angibt, geben zuverlässige Implementierungen einen Fehler und das Datum wird als NA gemeldet. Leider sind einige gebräuchliche Implementierungen (wie glibc ) unzuverlässig und schätzen die beabsichtigte Bedeutung ein.

    Eine einfache Lösung wäre, das Datum "01" an jedem Datum strptime() und strptime() als ersten Tag des Monats zu verwenden.


    Für diejenigen, die ein wenig mehr Hintergrundinformationen über die Verarbeitung von Daten und Zeiten in R suchen:

    Verwenden POSIXct in R Zeiten POSIXct und POSIXlt classn und Daten verwenden Sie die Date class.

    Die Daten werden als die Anzahl der Tage seit dem 1. Januar 1970 und die Zeiten als die Anzahl der Sekunden seit dem 1. Januar 1970 gespeichert.

    Also zum Beispiel:

     d < - as.Date("1971-01-01") unclass(d) # one year after 1970-01-01 # [1] 365 pct <- Sys.time() # in POSIXct unclass(pct) # number of seconds since 1970-01-01 # [1] 1450276559 plt <- as.POSIXlt(pct) up <- unclass(plt) # up is now a list containing the components of time names(up) # [1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst" "zone" # [11] "gmtoff" up$hour # [1] 9 

    So führen Sie Vorgänge an Daten und Uhrzeiten durch:

     plt - as.POSIXlt(d) # Time difference of 16420.61 days 

    Und um Daten zu verarbeiten, können Sie strptime() (indem Sie diese Beispiele aus der Manpage strptime() ):

     strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS") # [1] "2006-02-20 11:16:16 EST" # And in vectorized form: dates < - c("1jan1960", "2jan1960", "31mar1960", "30jul1960") strptime(dates, "%d%b%Y") # [1] "1960-01-01 EST" "1960-01-02 EST" "1960-03-31 EST" "1960-07-30 EDT" 

    Ich denke @ ben-rollerts Lösung ist eine gute Lösung.

    Sie müssen nur vorsichtig sein, wenn Sie diese Lösung in einer function in einem neuen Paket verwenden möchten.

    Bei der Entwicklung von Paketen wird empfohlen, die packagename::function_name() (siehe http://kbroman.org/pkg_primer/pages/depends.html ).

    In diesem Fall müssen Sie die Version von as.Date() die von der zoo Bibliothek definiert wird.

    Hier ist ein Beispiel :

     > devtools::session_info() Session info ---------------------------------------------------------------------------------------------------------------------------------------------------- setting value version R version 3.3.1 (2016-06-21) system x86_64, linux-gnu ui RStudio (1.0.35) language (EN) collate C tz  date 2016-11-09 Packages -------------------------------------------------------------------------------------------------------------------------------------------------------- package * version date source devtools 1.12.0 2016-06-24 CRAN (R 3.3.1) digest 0.6.10 2016-08-02 CRAN (R 3.2.3) memoise 1.0.0 2016-01-29 CRAN (R 3.2.3) withr 1.0.2 2016-06-20 CRAN (R 3.2.3) > as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) Error in as.Date.default(zoo::as.yearmon("1989-10", "%Y-%m")) : do not know how to convert 'zoo::as.yearmon("1989-10", "%Y-%m")' to class “Date” > zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) [1] "1989-10-01" 

    Wenn Sie also ein Paket entwickeln, sollten Sie Folgendes verwenden:

     zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))