[Résolu] Format heure avec hm()

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Laëtitia VIBERT
Messages : 42
Enregistré le : 16 Avr 2019, 10:13

[Résolu] Format heure avec hm()

Messagepar Laëtitia VIBERT » 25 Mar 2021, 16:02

Bonjour,

Après avoir transformé ma variable time, qui était exprimée comme character, en heure avec lubridate::hm(), je me rends compte que le format 00:xx est automatiquement mis en xxM 00s, y a-t-il un moyen de modifier cela ?
Je crois que le problème vient du fait que hm() me retourne une période et non une heure, mais je ne vois pas quelle autre formule utiliser...
Je ne peux pas utiliser hms::as.hms() car le format du temps est "HH:MM"

Code : Tout sélectionner

dat_test <- structure(list(Date_Received = c("2013-01-01", "2013-01-01", "2013-01-01", "2013-01-01", "2013-01-01", "2013-01-01"),
Time_Received = c("00:45", "01:45", "02:51", "03:18", "07:48", "08:30")),
row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"))

dat_test %>%
  mutate(Date_Received = ymd(Date_Received)) %>%
  mutate(Time_Received = hm(Time_Received)) ->
  dat_test2

head(dat_test$Time_Received)
[1] "00:45" "01:45" "02:51" "03:18" "07:48" "08:30"

head(dat_test2$Time_Received)
[1] "45M 0S"    "1H 45M 0S" "2H 51M 0S" "3H 18M 0S" "7H 48M 0S" "8H 30M 0S"


C'est un peu problématique pour la suite de mes analyses

Merci pour votre aide
L.

Fred Santos
Messages : 233
Enregistré le : 11 Avr 2009, 10:00
Contact :

Re: format heure avec hm()

Messagepar Fred Santos » 25 Mar 2021, 16:22

Bonjour,

Laëtitia VIBERT a écrit :C'est un peu problématique pour la suite de mes analyses

Justement, je rebondis là-dessus : quelle serait la suite ? En particulier, y a-t-il de bonnes raisons de travailler sur l'heure seule, prise isolément, plutôt que sur le couple (jour, heure) ? Car dans le second cas, par exemple :

Code : Tout sélectionner

dates <- apply(dat_test, 1, paste, collapse = " ")
strptime(dates, format = "%Y-%m-%d %H:%M")

#> [1] "2013-01-01 00:45:00 CET" "2013-01-01 01:45:00 CET"
#> [3] "2013-01-01 02:51:00 CET" "2013-01-01 03:18:00 CET"
#> [5] "2013-01-01 07:48:00 CET" "2013-01-01 08:30:00 CET"

vous transformerait les chaînes de caractères initiales en objet de classe POSIXlt. Mais tout dépend peut-être de la suite des analyses, justement. :-)

Laëtitia VIBERT
Messages : 42
Enregistré le : 16 Avr 2019, 10:13

Re: format heure avec hm()

Messagepar Laëtitia VIBERT » 25 Mar 2021, 17:15

Bonsoir

Fred Santos a écrit : Justement, je rebondis là-dessus : quelle serait la suite ?


J'utilise group_by() distinct() afin d'avoir le nombre d'observations d'un même individu par jour et par périodes de 2 à 4 heures (par exemple de 01:01 à 07:00 etc).
Si le format POSIXlt que je maîtrise mal peut me permettre de faire cela, pas de soucis, mais j'ai du mal avec l'idée d'avoir deux variables (date et time) dans une même variable Date Time...
Je vais essayer néanmois avec POSIXlt, et voir ce que ça donne...
L.

Fred Santos
Messages : 233
Enregistré le : 11 Avr 2009, 10:00
Contact :

Re: format heure avec hm()

Messagepar Fred Santos » 25 Mar 2021, 18:00

Réponse incomplète car je manque de temps ce soir, mais :
j'ai du mal avec l'idée d'avoir deux variables (date et time) dans une même variable Date Time

ça peut toutefois être nécessaire pour l'info "par périodes de 2 à 4 heures" : par exemple, sans l'info jour, il ne serait pas possible de savoir si les deux instants "23:00" et "01:00" sont distants de 2h ou de 22h. C'est souvent pour ce genre de problèmes qu'on garde une info standardisée de type "2013-01-01 00:45:00 CET".

Laëtitia VIBERT
Messages : 42
Enregistré le : 16 Avr 2019, 10:13

Re: format heure avec hm()

Messagepar Laëtitia VIBERT » 25 Mar 2021, 18:16

Oui, je comprends, mais dans mon cas, puisque j'utilise summarise() avec d'abord le group_by(Date_Received), je n'ai pas de problème. Par ailleurs, je veux seulement savoir combien d'observations j'ai par pas de temps pour chaque jour, donc si j'ai une observation à 01:24, ça rentre dans le pas de temps [01:01 ; 07:00] du jour de la variable "Date_received" par exemple.

Ce qui ne m'empêche pas, éventuellement, de conserver une variable Date-Time =)
L.

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: format heure avec hm()

Messagepar Mickael Canouil » 27 Mar 2021, 12:33

Bonjour,

si j’ai bien compris, vous souhaitez faire ce qui suit :

Code : Tout sélectionner

library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union
library(purrr)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

df <- as_tibble(map_df(
  .= 1:10, 
  
.= ~ data.frame(id = .x, measure = sample(= .y, size = 50, replace = TRUE)),
  .= seq(now(), now() + days(2), by = "15 min")
))
 


Code : Tout sélectionner

df %>% 
  group_by
(
    id, 
    date 
= date(measure), 
    interval 
= cut(hour(measure), seq(0, 24, 4), include.lowest = TRUE, right = FALSE)
  ) %>% 
  summarise
(= n(), .groups = "drop")
#> # A tibble: 129 x 4
#>       id date       interval     N
#>    <int> <date>     <fct>    <int>
#>  1     1 2021-03-27 [12,16)      4
#>  2     1 2021-03-27 [16,20)     10
#>  3     1 2021-03-27 [20,24]      3
#>  4     1 2021-03-28 [0,4)        3
#>  5     1 2021-03-28 [4,8)        2
#>  6     1 2021-03-28 [8,12)       9
#>  7     1 2021-03-28 [12,16)      3
#>  8     1 2021-03-28 [16,20)      3
#>  9     1 2021-03-28 [20,24]      5
#> 10     1 2021-03-29 [0,4)        3
#> # ... with 119 more rows
 


Pour simplement ajouter les comptages sans résumer l’information

Code : Tout sélectionner

(df_count <- add_count(
  x = df, 
  id
, 
  date 
= date(measure), 
  interval 
= cut(hour(measure), seq(0, 24, 4), include.lowest = TRUE, right = FALSE)
))
#> # A tibble: 500 x 5
#>       id measure             date       interval     n
#>    <int> <dttm>              <date>     <fct>    <int>
#>  1     1 2021-03-28 12:26:14 2021-03-28 [12,16)      3
#>  2     1 2021-03-29 01:11:14 2021-03-29 [0,4)        3
#>  3     1 2021-03-28 15:11:14 2021-03-28 [12,16)      3
#>  4     1 2021-03-28 04:26:14 2021-03-28 [4,8)        2
#>  5     1 2021-03-29 07:41:14 2021-03-29 [4,8)        3
#>  6     1 2021-03-28 20:11:14 2021-03-28 [20,24]      5
#>  7     1 2021-03-27 14:11:14 2021-03-27 [12,16)      4
#>  8     1 2021-03-29 06:26:14 2021-03-29 [4,8)        3
#>  9     1 2021-03-27 18:56:14 2021-03-27 [16,20)     10
#> 10     1 2021-03-28 10:11:14 2021-03-28 [8,12)       9
#> # ... with 490 more rows
 


Pour résumer l’information comme avec un summarise()

Code : Tout sélectionner

distinct(df_count, id, date, interval)
#> # A tibble: 129 x 3
#>       id date       interval
#>    <int> <date>     <fct>   
#>  1     1 2021-03-28 [12,16) 
#>  2     1 2021-03-29 [0,4)   
#>  3     1 2021-03-28 [4,8)   
#>  4     1 2021-03-29 [4,8)   
#>  5     1 2021-03-28 [20,24] 
#>  6     1 2021-03-27 [12,16) 
#>  7     1 2021-03-27 [16,20) 
#>  8     1 2021-03-28 [8,12)  
#>  9     1 2021-03-29 [8,12)  
#> 10     1 2021-03-28 [0,4)   
#> # ... with 119 more rows
 


Cordialement,

(Message entièrement réaliser avec une branche en attente de merge avec {reprex} https://github.com/tidyverse/reprex/pull/368, installable via remotes::install_github("mcanouil/reprex@bbcode_venue") )
Mickaël
mickael.canouil.fr | rlille.fr

Laëtitia VIBERT
Messages : 42
Enregistré le : 16 Avr 2019, 10:13

Re: format heure avec hm()

Messagepar Laëtitia VIBERT » 28 Mar 2021, 14:49

Merci beaucoup Mickael, après adaptation à mon dataset, ça a fonctionné comme je souhaitais !
Je n'avais jamais vu/trouvé malgré mes recherches, qu'on pouvait sélectionner la date / l'heure sur un format Date Time comme POSIXlt, donc c'est super =)

Merci pour votre aide, de nouveau !
Cordialement
L.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité