web-dev-qa-db-fra.com

Conversion date-heure et extraction uniquement de l'heure

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 ...

15
Antex

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.

16
rmuc8

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:

  • POSIXlt est une représentation Datetime (sous forme de liste de composants)
  • POSIXct est une représentation Datetime différente (sous forme numérique compacte)

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.

9
Dirk Eddelbuettel

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"
4
julbyk

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)

2
mpettis

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
1
Maksim Gayduk