Vous voulez changer la classe de Time en POSIXlt et extraire uniquement les heures minutes et secondes
str(df3$Time)
chr [1:2075259] "17:24:00" "17:25:00" "17:26:00" "17:27:00" ...
Utilisé la fonction strptime
df33$Time <- strptime(df3$Time, format = "%H:%M:%S")
Cela donne la date/heure ajoutée
> str(df3$Time)
POSIXlt[1:2075259], format: "2015-08-07 17:24:00" "2015-08-07 17:25:00" "2015-08-07 17:26:00" ...
Voulait extraire juste le temps sans changer la classe POSIXlt. en utilisant la fonction strftime
df3$Time <- strftime(df3$Time, format = "%H:%M:%S")
mais cela convertit la classe en "char" -
> class(df3$Time)
[1] "character"
Comment puis-je simplement extraire l'heure avec la classe définie sur POSIX ou numérique ...
Si vos données sont
a <- "17:24:00"
b <- strptime(a, format = "%H:%M:%S")
vous pouvez utiliser lubridate
pour avoir un résultat de classe integer
library(lubridate)
hour(b)
minute(b)
# > hour(b)
# [1] 17
# > minute(b)
# [1] 24
# > class(minute(b))
# [1] "integer"
et vous pouvez les combiner en utilisant
# character
paste(hour(b),minute(b), sep=":")
# numeric
hour(b) + minute(b)/60
par exemple.
Je ne conseillerais pas de le faire si vous souhaitez effectuer d'autres opérations sur vos données. Cependant, il peut être utile de le faire si vous souhaitez tracer les résultats.
Un objet date time contient la date et l'heure; vous ne pouvez pas extraire "juste le temps". Vous devez donc réfléchir à ce que vous voulez:
Aucun des deux n'omet la partie Date. Une fois que vous avez un objet valide, vous pouvez choisir de afficher uniquement l'heure. Mais vous ne pouvez pas faire disparaître la partie Date de la représentation.
Vous pouvez également utiliser le package chron
pour extraire quelques moments de la journée:
library(chron)
# current date/time in POSIXt format as an example
timenow <- Sys.time()
# create chron object "times"
onlytime <- times(strftime(timenow,"%H:%M:%S"))
> onlytime
[1] 14:18:00
> onlytime+1/24
[1] 15:18:00
> class(onlytime)
[1] "times"
Ceci est mon idiome pour obtenir uniquement le timepart d'un objet datetime. J'utilise floor_date()
de lubridate pour obtenir minuit de l'horodatage et prendre la différence entre l'horodatage et minuit de ce jour. Je crée et stocke un objet hms
fourni avec lubridate
(je crois) dans des cadres de données car la classe a le formatage de hh:mm:ss
qui est facile à lire, mais la valeur sous-jacente est une valeur numérique de secondes. Voici mon code:
library(tidyverse)
library(lubridate)
#>
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#>
#> date
# Create timestamps
#
# Get timepart by subtacting the timestamp from it's floor'ed date, make sure
# you convert to seconds, and then cast to a time object provided by the
# `hms` package.
# See: https://www.rdocumentation.org/packages/hms/versions/0.4.2/topics/hms
dt <- tibble(dt=c("2019-02-15T13:15:00", "2019-02-19T01:10:33") %>% ymd_hms()) %>%
mutate(timepart = hms::hms(as.numeric(dt - floor_date(dt, "1 day"), unit="secs")))
# Look at result
print(dt)
#> # A tibble: 2 x 2
#> dt timepart
#> <dttm> <time>
#> 1 2019-02-15 13:15:00 13:15
#> 2 2019-02-19 01:10:33 01:10
# `hms` object is really a `difftime` object from documentation, but is made into a `hms`
# object that defaults to always store data in seconds.
dt %>% pluck("timepart") %>% str()
#> 'hms' num [1:2] 13:15:00 01:10:33
#> - attr(*, "units")= chr "secs"
# Pull off just the timepart column
dt %>% pluck("timepart")
#> 13:15:00
#> 01:10:33
# Get numeric part. From documentation, `hms` object always stores in seconds.
dt %>% pluck("timepart") %>% as.numeric()
#> [1] 47700 4233
Créé le 2019-02-15 par le package reprex (v0.2.1)
Si vous le voulez au format POSIX, le seul moyen serait de le laisser tel quel et d'extraire juste la partie "time" à chaque fois que vous l'affichez. Mais en interne, ce sera toujours date + heure de toute façon. Si vous le souhaitez en numérique, cependant, vous pouvez simplement le convertir en nombre. Par exemple, pour obtenir le temps en nombre de secondes écoulées depuis le début de la journée:
df3$Time=df3$Time$sec + df3$Time$min*60 + df3$Time$hour*3600