Extrahieren Sie Monat und Jahr aus einem zoo :: yearmon-Objekt


112

Ich habe ein yearmonObjekt:

require(zoo)
date1 <- as.yearmon("Mar 2012", "%b %Y")
class(date1)
# [1] "yearmon"

Wie kann ich den Monat und das Jahr daraus extrahieren?

month1 <- fn(date1)
year1 <- fn(date1)

Welche Funktion soll ich anstelle von verwenden? fn()

Antworten:


143

Verwenden Sie die format()Methode für Objekte der Klasse "yearmon". Hier ist Ihr Beispieldatum (richtig erstellt!)

date1 <- as.yearmon("Mar 2012", "%b %Y")

Dann können wir die Datumsteile nach Bedarf extrahieren:

> format(date1, "%b") ## Month, char, abbreviated
[1] "Mar"
> format(date1, "%Y") ## Year with century
[1] "2012"
> format(date1, "%m") ## numeric month
[1] "03"

Diese werden als Zeichen zurückgegeben. Fügen Sie gegebenenfalls ein, as.numeric()wenn Sie das Jahr oder den numerischen Monat als numerische Variable verwenden möchten, z

> as.numeric(format(date1, "%m"))
[1] 3
> as.numeric(format(date1, "%Y"))
[1] 2012

Siehe ?yearmonund ?strftimefür Details - letzteres erklärt die Platzhalterzeichen, die Sie verwenden können.


4
% B für den ganzen Monat, dh März "statt" von "März"
PatrickT

Wie würde ich das tun, wenn ich eines vectorvon n Elementen hätte, sagen wir 1k Daten in einem vector?
Stophface

@Chrissl kann wie ein Großteil von R date1auch ein Datumsvektor sein .
Gavin Simpson

101

Das Lubridat-Paket ist für diese Art von Dingen erstaunlich:

> require(lubridate)
> month(date1)
[1] 3
> year(date1)
[1] 2012

2
Ha danke für diese Antwort. Es schlägt besonders die anderen Lösungen, wenn Sie etwas tun möchten, wenn (Jahr (Datum1)> 2014) {Jahr (Datum1) <- Jahr (Datum1) - 100}
Vincent

1
Dies war definitiv die beste Antwort auf meine Anforderungen, das Jahr aus den Startdaten von 4000 Verträgen herauszuholen.
d8aninja

@Ari B. Friedman Ich verwende derzeit R 3.1.0, während dieses lubridatePaket nicht unterstützt wird, und habe versucht, dieses und das verwendete Jahr (Datum) zu installieren, aber es gibt den Tag anstelle des Jahres an. Funktioniert dies nur an Daten, deren Format "2015-05" ist -06 "?
KRU

1
@KRU Bei neuen Versionen von R dauert es manchmal einige Wochen, bis die Repositorys alle Pakete aktualisiert haben. Es sollte in allen Datumsformaten funktionieren, solange es sich um ein echtes Datumsformat handelt, nicht um einen Zeichenvektor. Bitte posten Sie ein neues q, wenn dies Ihr Problem immer noch nicht löst und Sie SO nicht nach einer der Komponenten Ihrer Frage suchen können.
Ari B. Friedman

15

Ich weiß, dass das OP zoohier verwendet wird, aber ich habe festgestellt, dass dieser Thread nach einer Standardlösung tsfür dasselbe Problem googelt . Also dachte ich, ich würde auch eine zookostenlose Antwort hinzufügen ts.

# create an example Date 
date_1 <- as.Date("1990-01-01")
# extract year
as.numeric(format(date_1, "%Y"))
# extract month
as.numeric(format(date_1, "%m"))

12

Sie können verwenden format:

library(zoo)
x <- as.yearmon(Sys.time())
format(x,"%b")
[1] "Mar"
format(x,"%Y")
[1] "2012"

Wie kann ich den Monat zu einer Zahl machen? (zB 3 für März?)
Adam.888

@ user1169210 Ich habe dies in meiner Antwort behandelt. Sie möchten as.numeric(format(x, "%m"))für den Monat beispielsweise eine Zahl.
Gavin Simpson

5

Für große Vektoren:

y = as.POSIXlt(date1)$year + 1900    # x$year : years since 1900
m = as.POSIXlt(date1)$mon + 1        # x$mon : 0–11

1
Dies ist die beste Antwort, da R bereits das praktische POSIXltObjekt bereitstellt, das das Zoo-Paket unnötig macht
Marco Demaio

0

In der Frage wurde nicht genau angegeben, welche Ausgabe erwartet wird, sondern unter der Annahme, dass Sie für den Monat die Monatsnummer (Januar = 1) und für das Jahr das numerische 4-stellige Jahr möchten, und dann angenommen, dass wir gerade den Code in der Frage ausgeführt haben:

cycle(date1)
## [1] 3
as.integer(date1)
## [1] 2012

0

Nachdem ich von 1800 bis heute ein ähnliches Problem mit Daten hatte, funktionierte dies für mich:

data2$date=as.character(data2$date) 
lct <- Sys.getlocale("LC_TIME"); 
Sys.setlocale("LC_TIME","C")
data2$date<- as.Date(data2$date, format = "%Y %m %d") # and it works
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.