Estrai mese e anno da un oggetto zoo :: yearmon


112

Ho un yearmonoggetto:

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

Come posso estrarre il mese e l'anno da questo?

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

Quale funzione dovrei usare al posto di fn()

Risposte:


143

Usa il format()metodo per gli oggetti di classe "yearmon". Ecco la tua data di esempio (creata correttamente!)

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

Quindi possiamo estrarre le parti della data come richiesto:

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

Questi vengono restituiti come caratteri. Se appropriato, as.numeric()inserire se si desidera l'anno o il mese numerico come variabile numerica, ad es

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

Vedi ?yearmone ?strftimeper i dettagli: quest'ultimo spiega i caratteri segnaposto che puoi utilizzare.


4
% B per l'intero mese, ovvero marzo "invece" di "marzo"
PatrickT

Come lo farei se avessi un vectordi n elementi, diciamo 1k date in uno vector?
Stophface

@Chrissl come gran parte di R, date1può anche essere un vettore di date.
Gavin Simpson

101

Il pacchetto lubridate è fantastico per questo genere di cose:

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

2
Grazie per questa risposta. Soprattutto batte le altre soluzioni quando vuoi fare qualcosa come if (year (date1)> 2014) {year (date1) <- year (date1) - 100}
Vincent

1
questa è stata sicuramente la migliore risposta per le mie esigenze di prendere la parte dell'anno dalle date di inizio di 4000 contratti.
d8aninja

@Ari B. Friedman attualmente sto usando R 3.1.0 mentre questo non supporta il lubridatepacchetto e ho provato a installare questo e ha usato l'anno (data) ma fornisce il giorno invece dell'anno funziona solo con date il cui formato è "2015-05 -06 "?
KRU

1
@KRU Le nuove versioni di R a volte impiegano alcune settimane perché i repository aggiornino tutti i pacchetti. Dovrebbe funzionare su tutti i formati di data purché si tratti di un vero formato di data, non di un vettore di caratteri. Pubblica un nuovo q se il problema persiste e non puoi cercare SO per nessuno dei componenti della tua domanda.
Ari B. Friedman

15

So che l'OP sta usando zooqui, ma ho trovato questo thread che cerca su Google una tssoluzione standard per lo stesso problema. Quindi ho pensato di aggiungere anche una zoorisposta gratuita 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

Puoi usare format:

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

Come posso fare in modo che il mese sia un numero? (ad esempio 3 per marzo?)
adam.888

@ user1169210 Ne ho parlato nella mia risposta. Ad esempio, vuoi as.numeric(format(x, "%m"))il mese come valore numerico.
Gavin Simpson

5

Per vettori di grandi dimensioni:

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

1
Questa è la risposta migliore, poiché R fornisce già l' POSIXltoggetto pratico che rende superfluo il pacchetto zoo
Marco Demaio

0

La domanda non indicava esattamente quale output è previsto, ma supponendo che per il mese si desidera il numero del mese (gennaio = 1) e per l'anno si desidera l'anno numerico a 4 cifre, quindi assumendo che abbiamo appena eseguito il codice nella domanda:

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

0

Avendo avuto un problema simile con i dati dal 1800 ad oggi, questo ha funzionato per me:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.