Extraia mês e ano de um objeto zoo :: yearmon


112

Eu tenho um yearmonobjeto:

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

Como posso extrair o mês e o ano disso?

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

Qual função devo usar no lugar de fn()

Respostas:


143

Use o format()método para objetos de classe "yearmon". Aqui está sua data de exemplo (criada corretamente!)

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

Então, podemos extrair as partes da data conforme necessário:

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

Eles são retornados como caracteres. Quando apropriado, inclua as.numeric()se quiser o ano ou mês numérico como uma variável numérica, por exemplo

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

Consulte ?yearmone ?strftimepara obter detalhes - o último explica os caracteres de espaço reservado que você pode usar.


4
% B para o mês inteiro, ou seja, março "em vez" de "março"
PatrickT

Como eu faria isso se tivesse um vectorde n elementos, digamos 1k datas em um vector?
Stophface

@Chrissl gosta muito de R, date1pode ser um vetor de datas também.
Gavin Simpson

101

O pacote de lubrificação é incrível para esse tipo de coisa:

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

2
Obrigado por esta resposta. Supera especialmente as outras soluções quando você deseja fazer algo como if (ano (data1)> 2014) {ano (data1) <- ano (data1) - 100}
Vincent

1
esta foi definitivamente a melhor resposta para meus requisitos de tirar a parte do ano das datas de início de 4000 contratos.
d8aninja

@Ari B. Friedman estou atualmente usando R 3.1.0 enquanto este lubridatepacote não suporta e tentei instalar este e usei ano (data) mas ele fornece o dia em vez do ano isso só funciona em datas cujo formato é "2015-05 -06 "?
KRU

1
@KRU As novas versões do R às vezes levam algumas semanas para que os repositórios atualizem todos os pacotes. Ele deve funcionar em todos os formatos de data, desde que seja um formato de data verdadeiro, não um vetor de caracteres. Por favor, poste um novo q se isso ainda não resolver seu problema e você não conseguir pesquisar o SO para nenhum dos componentes de sua pergunta.
Ari B. Friedman

15

Eu sei que o OP está usando zooaqui, mas encontrei este tópico pesquisando por uma tssolução padrão para o mesmo problema. Então, pensei em adicionar uma zooresposta gratuita para tstambém.

# 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

Você pode usar format:

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

Como posso fazer com que o mês seja um número? (por exemplo, 3 para março?)
adam.888

@ user1169210 Abordei isso em minha resposta. Você quer as.numeric(format(x, "%m"))para o mês como um numérico, por exemplo.
Gavin Simpson

5

Para vetores grandes:

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

1
Esta é a melhor resposta, uma vez que R já fornece o POSIXltobjeto útil que torna o pacote zoo desnecessário
Marco Demaio

0

A pergunta não indicava exatamente qual saída é esperada, mas assumindo que para o mês você deseja o número do mês (janeiro = 1) e para o ano você deseja o ano numérico de 4 dígitos, então assumindo que acabamos de executar o código na pergunta:

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

0

Tendo tido um problema semelhante com dados de 1800 até agora, isso funcionou para mim:

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.