119 votes

Extraire le mois et l'année d'un objet zoo::yearmon

J'ai un yearmon objet :

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

Comment puis-je en extraire le mois et l'année ?

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

Quelle fonction dois-je utiliser à la place de fn()

150voto

Gavin Simpson Points 72349

Utilisez le format() pour les objets de la classe "yearmon" . Voici votre exemple de date (correctement créée !)

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

Ensuite, nous pouvons extraire les parties de la date selon les besoins :

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

Ils sont renvoyés sous forme de caractères. Le cas échéant, les caractères sont enveloppés dans as.numeric() si vous voulez l'année ou le mois numérique comme une variable numérique, par ex.

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

Ver ?yearmon y ?strftime pour plus de détails - ce dernier explique les caractères de remplacement que vous pouvez utiliser.

4 votes

%B pour le mois complet, c'est-à-dire mars "au lieu de" "Mar".

0 votes

Comment je ferais ça si j'avais un vector de n éléments, disons 1k dates dans une vector ?

0 votes

@Chrissl comme une grande partie de R, date1 peut également être un vecteur de dates.

106voto

Ari B. Friedman Points 24940

El paquet de lubrifiants est incroyable pour ce genre de choses :

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

2 votes

Ha merci pour cette réponse. Elle bat surtout les autres solutions quand on veut faire quelque chose comme if(year(date1) > 2014){year(date1) <- year(date1) - 100}

1 votes

C'était sans aucun doute la meilleure réponse à mes besoins de supprimer le morceau d'année des dates de début de 4000 contrats.

0 votes

@Ari B. Friedman Je suis actuellement en train d'utiliser R 3.1.0 alors qu'il ne prend pas en charge. lubridate J'ai essayé d'installer ce paquet et j'ai utilisé year(date) mais cela donne le jour au lieu de l'année. Cela ne fonctionne-t-il que pour les dates dont le format est "2015-05-06" ?

15voto

Matt Bannert Points 6390

Je sais que l'OP utilise zoo ici, mais j'ai trouvé ce fil de discussion en cherchant sur Google une norme ts pour le même problème. J'ai donc pensé ajouter un zoo -réponse gratuite pour ts également.

# 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"))

0 votes

S'il est utilisé avec l'entrée de la question, il utilise format.yearmon de zoo, il n'est donc pas vrai qu'il n'utilise que la base R.

0 votes

Merci pour cette précision. On dirait que S3 m'a joué un tour.

12voto

James Points 24725

Vous pouvez utiliser format :

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

0 votes

Comment puis-je faire en sorte que le mois soit un nombre ? (par exemple 3 pour Mar ?)

0 votes

@user1169210 J'ai couvert ce point dans ma réponse. Vous voulez as.numeric(format(x, "%m")) pour le mois sous forme numérique par exemple.

-5voto

user3793805 Points 1

J'ai fait cela, car si on utilise zoo, on a des problèmes avec ggplot, etc.

  • GT[,1]<- as.Date(GT[,1])
  • 'GT$date<-paste(year(GT[,1]),month(GT[,1]), "01",sep="-")''
  • "GT$date<-as.Date(GT$date)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X