web-dev-qa-db-fra.com

Convertir le caractère en date en R

Je suis relativement nouveau dans R, mais c'est la première fois que je dois gérer des conversions de dates. J'ai lu mes données à partir d'un CSV (en utilisant read.table ()), mais j'ai raccourci les données pour mettre en évidence mon problème. Lorsqu'il est lu dans R, le champ Date est un caractère.

Simplement, la plupart de mes dates sont forcées correctement, à l'exception de quelques cas. Nous espérons que l'exemple ci-dessous vous montrera ce qui se passe.

# my attempt to coerce the date -- uses the stringr package
prods.all$Date2 <- as.Date(str_sub(prods.all$Date, 1, 
                str_locate(prods.all$Date, " ")[1]-1), 
                "%m/%d/%Y")

# grab two rows to highlight my issue
temp <- prods.all[c(1925:1926), c(1,8)]

> temp
                   Date      Date2
1925  10/9/2009 0:00:00 2009-10-09
1926 10/15/2009 0:00:00 0200-10-15

Comme vous pouvez le voir, l'année de certaines dates est inexacte. Le modèle semble se produire lorsque le jour est à deux chiffres.

J'ai parcouru quelques livres et essayé de mieux Google, mais tout semble suggérer que mes données ne sont pas formatées correctement en entrée.

Compte tenu de la puissance de R, je pense qu'il existe un moyen très simple de forcer ma colonne à être des dates valides et que je néglige une solution très évidente.

Toute aide que vous pourrez apporter sera grandement appréciée.

26
Btibert3

Vous compliquez peut-être trop les choses, y a-t-il une raison pour laquelle vous avez besoin du package stringr?

 df <- data.frame(Date = c("10/9/2009 0:00:00", "10/15/2009 0:00:00"))
 as.Date(df$Date, "%m/%d/%Y %H:%M:%S")

[1] "2009-10-09" "2009-10-15"

Plus généralement et si vous avez également besoin de la composante temps, utilisez strptime:

strptime(df$Date, "%m/%d/%Y %H:%M:%S")

J'imagine à quoi pourraient ressembler vos données réelles à partir des résultats partiels que vous donnez.

46
mdsumner

La façon la plus simple est d'utiliser du lubrifiant:

library(lubridate)
prods.all$Date2 <- mdy(prods.all$Date2)

Cette fonction renvoie automatiquement les objets de la classe POSIXct et fonctionnera avec des facteurs ou des caractères.

58
hadley