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


112

J'ai un yearmonobjet:

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()

Réponses:


143

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

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

Ensuite, nous pouvons extraire les parties de 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"

Ceux-ci sont renvoyés sous forme de caractères. Le cas échéant, indiquez as.numeric()si vous voulez que l'année ou le mois numérique soit une variable numérique, par exemple

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

Voir ?yearmonet ?strftimepour plus de détails - ce dernier explique les caractères d'espace réservé que vous pouvez utiliser.


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

Comment ferais-je cela si j'avais un vectorde n éléments, disons 1k dates en un vector?
Stophface

@Chrissl comme beaucoup de R, date1peut aussi être un vecteur de dates.
Gavin Simpson

101

Le paquet lubrifiant est incroyable pour ce genre de chose:

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

2
Ha merci pour cette réponse. Cela bat surtout les autres solutions lorsque vous voulez faire quelque chose comme if (year (date1)> 2014) {year (date1) <- year (date1) - 100}
Vincent

1
c'était certainement la meilleure réponse à mes besoins de retirer la partie de l'année des 4000 dates de début de contrats.
d8aninja

@Ari B. Friedman J'utilise actuellement R 3.1.0 alors que cela ne prend pas en charge le lubridatepackage et j'ai essayé de l'installer et utilisé l'année (date) mais cela donne le jour au lieu de l'année cela ne fonctionne que sur les dates dont le format est "2015-05 -06 "?
KRU

1
@KRU Les nouvelles versions de R prennent parfois quelques semaines pour que les référentiels mettent à jour tous les packages. Il devrait fonctionner sur tous les formats de date tant qu'il s'agit d'un vrai format de date, pas d'un vecteur de caractères. Veuillez publier un nouveau q si cela ne résout toujours pas votre problème et que vous ne pouvez pas rechercher SO pour l'un ou l'autre des composants de votre question.
Ari B.Friedman

15

Je sais que l'OP utilise zoo ici, mais j'ai trouvé ce fil de recherche sur Google pour une tssolution standard pour le même problème. J'ai donc pensé que j'ajouterais également une zooréponse gratuite 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

Vous pouvez utiliser format:

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

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

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

5

Pour les grands vecteurs:

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

1
C'est la meilleure réponse, puisque R fournit déjà l' POSIXltobjet pratique qui rend le paquet zoo inutile
Marco Demaio

0

La question n'indiquait pas précisément la sortie attendue, mais en supposant que pour le mois vous voulez le numéro du mois (janvier = 1) et pour l'année que vous voulez l'année numérique à 4 chiffres, en supposant que nous venons d'exécuter le code de la question:

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

0

Ayant eu un problème similaire avec les données de 1800 à maintenant, cela a fonctionné pour moi:

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.