1
votes

Comment modifier les valeurs de date?

Comment pourrais-je modifier les valeurs de date brutes. Par exemple.

> DF2
  Date     
1 11/01/2018  
2 7/31/2014  
3 6/10/2015
4 10/20/2017 

Dans les valeurs de date modifiées, celle avec "/"

> DF2
  Date     
1 11012018  
2 7312014  
3 6102015
4 10202017  


2 commentaires

Voulez-vous que la colonne soit une classe de caractère ou date ?


Copie possible de stackoverflow .com / questions / 8398131 /…


3 Réponses :


1
votes

Utilisez lubridate pour toutes les tâches liées à la date et à l'heure

format(lubridate::mdy(c("11012018", "7/31/2014")), "%m/%d/%Y")
[1] "11/01/2018" "07/31/2014"

Vous pouvez également le formater si nécessaire:

XXX

En supposant: votre date est au format mois-date-année. Sinon, vous pouvez utiliser d'autres fonctions lubridate


4 commentaires

Essayez l'entrée suivante dmy ("7312014")


@RonakShah l'a corrigé


OP a une entrée comme 7312014 et veut une sortie comme 7/31/2014 . Vous avez pris l'entrée en tant que 31/07/2014 .


Vérifiez leur sortie attendue, 31/07/2014 , ils veulent juste mettre des barres obliques comme séparateur, il n'est pas clair s'ils le veulent dans la classe de date.



0
votes

Une solution possible pourrait être:

df <- data.frame(lapply(df, function(x) as.Date(as.character(x), "%m%d%Y")))

Et une autre qui peut convertir au format mm / jj / aaaa requis est la suivante:

df <- transform(df, V1 = as.Date(as.character(V1), "%d%m%Y"))

Les deux solutions sont via le package de base R.


3 commentaires

Il s'agit du format mois-jour-année, voir la deuxième ligne à titre d'exemple: "31/07/2014"


Si c'est la réponse qu'ils veulent, tout va bien, mais c'est un message en double. Vérifiez leur sortie attendue, 31/07/2014 , ils veulent juste mettre des barres obliques comme séparateur, il n'est pas clair s'ils le veulent dans la classe de date.


Peut-être que j'étais confus, les données semblaient apparemment numériques ou entières. Heureux de supprimer ma réponse, si ce n'est pas le cas!



1
votes

Nous pourrions également utiliser (il est supposé qu'il vous suffit d'ajouter un nouveau séparateur. Dans tous les cas, vous pouvez revenir au type date-heure):

test3<-c("11012018", "1112015", "7312014", "7312014", "10202017", "772007", "772007", 
         "7072007")

Modifier: Plus généralement, comme suggéré par @ jay.sf,

test4<-gsub("(^[0-1]?\\d)([0-3]?\\d)(\\d{4}$)","\\1 \\2 \\3",df$Date)
gsub(" ","/",test4)
#[1] "11/01/2018" "7/31/2014"  "6/10/2015"  "10/20/2017"

Ceci est pour tenir compte des formats de date tels que:

new<-gsub("([0-9]{,2})([0-9]{2})([0-9]{4})","\\1 \\2 \\3",df$Date)
gsub(" ","/",new)
#[1] "11/01/2018" "7/31/2014"  "6/10/2015"  "10/20/2017" 

p >


5 commentaires

gentil, comment généreriez-vous cela à par exemple 772017 ?


@ jay.sf Intéressant! Peut-être pourrions-nous le faire séparément comme ceci: test <- "772017"; test1 <-gsub ("([0-9] {, 2}) ([0-9] {, 1}) ([0-9] {4})", "\\ 1 \\ 2 \\ 3 ", test) Je vais voir si je peux écrire une solution plus générale.


Je soutiens cela. Essayez cette expression régulière "(^ [0-1]? \\ d) ([0-3]? \\ d) (\\ d {4} $)" et testez-la sur c (11012018, 1112015, 7312014, 7312014, 10202017, 772007, 772007, 7072007) .


@ jay.sf Ajouté à la réponse. Merci!


également pour "0772007" , mon code numérique a légèrement échoué