41 votes

Convertir le caractère en classe Date

J'ai un cadre de données avec une colonne de dates en caractères.

Quand j'utilise as.Date La plupart de mes dates sont analysées correctement, à l'exception de quelques cas. L'exemple ci-dessous vous montrera, je l'espère, ce qui se passe.

# my attempt to parse the string to 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 constater, l'année de certaines dates est inexacte. La tendance semble se produire lorsque le jour est à deux chiffres.

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

73voto

hadley Points 33766

Le moyen le plus simple est d'utiliser lubridate :

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.

61voto

mdsumner Points 13001

Vous compliquez peut-être trop les choses, y a-t-il une raison pour laquelle vous avez besoin du pack stringr ? Vous pouvez utiliser as.Date et son format pour spécifier l'option entrée format de votre chaîne.

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

Notez le Détails section de ?as.Date :

Les chaînes de caractères sont traitées aussi loin que nécessaire pour le format spécifié : les caractères de fin de chaîne sont ignorés.

Ainsi, cela fonctionne également :

as.Date(df$Date, format =  "%m/%d/%Y)
# [1] "2009-10-09" "2009-10-15"

Toutes les spécifications de conversion qui peuvent être utilisées pour spécifier l'entrée format se trouvent dans le Détails section dans ?strptime . Assurez-vous que le commander de la spécification de conversion ainsi que tout séparateurs correspondent exactement au format de votre entrée chaîne.


De manière plus générale et si vous avez également besoin de la composante temporelle, utilisez as.POSIXct o strptime :

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

Je devine à quoi pourraient ressembler vos données réelles à partir des résultats partiels que vous donnez.

1voto

Nayab khan Points 21

library(lubridate) si votre format de date est comme ceci '04/24/2017 05:35:00'alors changez-le comme ci-dessous prods.all$Date2<-gsub("/","-",prods.all$Date2) puis changez le format de la date parse_date_time(prods.all$Date2, orders="mdy hms")

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