web-dev-qa-db-fra.com

Heure de date partagée

J'ai un df avec une colonne datetime (DD: MM: yyyy HH: mm: ss) nommée "Start" et je voudrais diviser cette colonne en deux nommées "date" et "time".
Maintenant, j'ai essayé ce qui suit:

df$Date <- sapply(strsplit(as.character(df$Start), " "), "[", 1)
df$Time <- sapply(strsplit(as.character(df$Start), " "), "[", 2)

Cela fonctionne, cependant, si j'utilise la fonction str (df) (je la raccourcis pour que vous puissiez surtout voir les variables de ma préoccupation).

'data.frame': 18363 obs. de 19 variables:
$ Début: Facteur avec 67 niveaux "2013-09-01 08: 07: 41.000", ..: 1 1 1 1 1 1 1 1 1 1 1 ...
$ Intervalle: int 47259 47259 47259 47259 47259 47259 47259 47259 47259 47259 ...
$ DateTime: Facteur avec 18363 niveaux "2013-09-01 08: 07: 41.350", ..: 1 2 3 4 5 6 7 8 9 10 ...
$ TimeSensor: num 158489 158489 158490 158490 158491 ...


Alors maintenant, je dois seulement savoir comment convertir l'heure et la date de "facteurs" en "heure" et "date".

Si quelqu'un connaît la solution, je vous en serais très reconnaissant! Je suis un noob concernant R alors s'il vous plaît ne me brûlez pas au sol ..

Mille mercis!

21
Jalalala

Désolé pour cette réponse tardive! Quoi qu'il en soit, j'ai obtenu l'aide de quelqu'un à l'université et il a proposé l'ajustement suivant, très simple, de mon code temporel ..:

df$Date <- as.Date(df$Start) #already got this one from the answers above
df$Time <- format(as.POSIXct(df$Start) ,format = "%H:%M:%S") 

Cela convertit les facteurs en "date" et "POSIXct", exactement comme je le voulais.

Merci à tous pour votre aide! J'espère que je pourrai rendre une sorte de faveur à l'avenir, bien que je doute que ce soit avec la programmation ..!

13
Jalalala

Que diriez-vous

df$Date <- as.Date(df$Start)

df$Time <- format(df$Start,"%H:%M:%S")
24
Geoffrey Absalom

En voyant le format de votre colonne, je dirais que vous pouvez utiliser as.POSIXct pour formater correctement votre colonne, puis utiliser format () pour extraire les données souhaitées.

Ceci est le code que j'utilise lors du fractionnement d'une colonne DateTime,

df$Time <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%H:%M:%S")

df$Date <- format(as.POSIXct(df$Start,format="%Y:%m:%d %H:%M:%S"),"%Y:%m:%d")
4
Manuel Zangroniz

Vous préférerez peut-être faire quelque chose comme ça, en évitant d'utiliser une boucle lapply qui n'est pas vraiment nécessaire (mais ce n'est pas une mauvaise chose non plus!) ...

#  If we had this data...
df <- data.frame( Start = c( "13:11:2013 15:39" , "13:11:2013 16:15" , "13:11:2013 17:52" ) )

#  We can directly make two columns from the split strings without
#  using a loop by call 'do.call'..
new <- do.call( rbind , strsplit( as.character( df$Start ) , " " ) )
#     [,1]         [,2]   
#[1,] "13:11:2013" "15:39"
#[2,] "13:11:2013" "16:15"
#[3,] "13:11:2013" "17:52"


#  Cbind them to the original data liek so...
cbind( df , Date = new[,2] , Time = new[,1] )
#             Start  Date       Time
#1 13:11:2013 15:39 15:39 13:11:2013
#2 13:11:2013 16:15 16:15 13:11:2013
#3 13:11:2013 17:52 17:52 13:11:2013
2
Simon O'Hanlon

En supposant que vos données ressemblent à ceci avec une colonne datetime et de nombreuses autres colonnes

df <- data.frame(a = 1:5, datetime = as.POSIXct(c('2019-02-01 01:00:00', 
                 '2019-02-01 02:00:00', '2019-02-01 03:00:00', 
                 '2019-02-01 04:00:00', '2019-02-01 05:00:00')))

df
#  a            datetime
#1 1 2019-02-01 01:00:00
#2 2 2019-02-01 02:00:00
#3 3 2019-02-01 03:00:00
#4 4 2019-02-01 04:00:00
#5 5 2019-02-01 05:00:00

Nous pouvons diviser la colonne sur des espaces (ou tout autre délimiteur présent) pour obtenir des colonnes de date et d'heure distinctes qui peuvent être effectuées en utilisant tidyr::separate

tidyr::separate(df, datetime, c("date", "time"), sep = " ")
#  a       date     time
#1 1 2019-02-01 01:00:00
#2 2 2019-02-01 02:00:00
#3 3 2019-02-01 03:00:00
#4 4 2019-02-01 04:00:00
#5 5 2019-02-01 05:00:00

Si nous voulons conserver la colonne d'origine (datetime) nous pouvons ajouter remove = FALSE.

0
Ronak Shah