web-dev-qa-db-fra.com

Convertir des valeurs d'année à quatre chiffres en un type de date

J'ai une colonne entière dans mon jeu de données qui a des valeurs d'année à quatre chiffres, comme:

 2001 2002 2002 2002 2003 2005 

J'essaie de convertir la valeur de l'année à quatre chiffres en type Date.

Le code que j'utilise est:

year <- as.Date(as.character(data_file$evtYear), format = "%Y")

Mais le résultat est:

"2001-05-15" "2002-05-15" "2002-05-15" "2002-05-15" "2003-05-15" "2005-05-15"

Cela donne la mauvaise sortie. Cela donne des valeurs sur deux ans dans une date (2001 et 15 également).

Je veux juste convertir ma partie d'année à quatre chiffres des données d'origine en "Année" dans le type Date. Ce qui est attendu est tout simplement:

2001 2002 2002 2002 2003 2005 

Mais leur classe devrait être de type Date.

Comment y parvenir en R?

15
LearneR

D'après les commentaires, il est apparu que la personne qui posait la question n'avait pas besoin de changer l'année numérique en classe "Date"; néanmoins, la question posée est de savoir comment le faire, voici donc une réponse.

Voici quelques manières de créer un objet de classe "Date" à partir d'une année numérique à 4 chiffres. Tous utilisent as.Date:

yrs <- c(2001, 2002, 2002, 2002, 2003, 2005)

1) ISOdate

as.Date(ISOdate(yrs, 1, 1))  # beginning of year
as.Date(ISOdate(yrs, 12, 31))  # end of year

Cette solution ISOdate est un peu délicate car elle crée un objet POSIXct intermédiaire pour éviter les problèmes de fuseau horaire. Vous pourriez préférer l'une des options suivantes.

2) coller

as.Date(paste(yrs, 1, 1, sep = "-")) # beginning of year
as.Date(paste(yrs, 12, 31, sep = "-")) # end of year

3) Zoo :: as.yearmon  

library(Zoo)

as.Date(as.yearmon(yrs)) # beginning of year
as.Date(as.yearmon(yrs) + 11/12, frac = 1) # end of year

Remarque: Si y est le résultat de l'une des opérations ci-dessus, format(y, "%Y") donne l'année du caractère et as.numeric(format(y, "%Y")) indique l'année numérique.

12
G. Grothendieck

Comme déjà reconnu par le PO, une année seule ne constitue pas une date valide car le mois et le jour ne sont pas spécifiés. 

Toutefois, certaines fonctions de conversion de date et d'heure, telles que ymd(), parse_date_time(), dans le package lubridate reconnaissent un paramètre truncated afin de permettre l'analyse de dates incomplètes:

yrs <- c(2001, 2002, 2002, 2002, 2003, 2005)
lubridate::ymd(yrs, truncated = 2L)
[1] "2001-01-01" "2002-01-01" "2002-01-01" "2002-01-01" "2003-01-01" "2005-01-01"

Les années ont été complétées au 1er janvier pour donner une date valide. Le résultat est de classe Date.

5
Uwe

Tu peux faire:

library(lubridate)
yrs <- c(2001, 2002, 2002, 2002, 2003, 2005)
yr <- as.Date(as.character(yrs), format = "%Y")
y <- year(yr)

Sortie:

2001 2002 2002 2002 2003 2005
2
Surya

Une réponse lubrifiante:

  library(lubridate)
  year <- ymd(sprintf("%d-01-01",data_file$evtYear))
1
Mike Wise