lubridate ou timetk:extraction plage horaire a cheval sur 2 jours

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

Didier Bozonnet
Messages : 60
Enregistré le : 04 Fév 2012, 12:35

lubridate ou timetk:extraction plage horaire a cheval sur 2 jours

Messagepar Didier Bozonnet » 07 Nov 2023, 11:07

Bonjour

J'ai une extraction d'un logiciel de surveillance en température (données sources). Extraction des données au format.csv entre deux dates qui vous varier selon la fréquence d'extraction.
Je travaille avec les package 'lubridate' , 'hms' et j'ai intégré aussi 'timetk' si utile (mais pour l'instant je ne l'utilise pas)

Avec cette première partie de code je crée mon tibble

Code : Tout sélectionner

ini<-read_csv2("tumocong5_dec2022_ini.csv", col_names = c("date","temp" ), col_types= list("?","?"), skip = 2)%>%
  filter(!is.na(temp))%>%
  mutate(DaTime = dmy_hm(date),   
         date = as.Date(DaTime),
         heure=as_hms(DaTime))%>%
  dplyr::select(DaTime,date,heure,temp)


Note: je ne sais pas trop comment intégrer une image de mes données (19773 données) donc voilà un résumé; 4 vecteurs
DaTime - format POSIXct - "aaaa-mm-jj hh:mm:ss"
date - format date "aaaa-mm-jj"
heure - format hms "hh:mm:ss"
temp - format num

note: peut-être que les vecteurs heure et date ne seront plus utile selon sur quel vecteurs vous allez travaillé

Jusqu'à présent j'ai grugé en ne sélectionnant que les données de minuit à 9:00 du matin sur une seule journée en ajoutant au code ci-dessous la ligne

Code : Tout sélectionner

filter((heure>= as_hms(0) & heure<as_hms(32400)))


Mais maintenant pour avoir plus de valeurs je souhaiterais filtrer les données de 22:00:00 (jour J) à 8:00:00 le lendemain (J+1) (=période nuit). Et c'est là qu'apparait mon incompréhension. Comment filtrer uniquement cette période nuit ?
PUIS
Comment modifier le code suivant pour pourvoir calculer uniquement sur la période nuit?

Code : Tout sélectionner

ini1<- ini %>%
  group_by(periode_nuit)%>%
  reframe(N=n(),
          m=mean(temp,na.rm=TRUE),
          ec=sd(temp,na.rm=TRUE)) %>%
  mutate (Cpku=(-70-m)/(3*ec)) %>%
  mutate (groupe="initial") %>%
  mutate (mSup = m+3*ec, mInf = m-3*ec)


Je suis désolé si le format n'est pas au poil car je viens très rarement
Merci par avance pour votre aide
Didier
Par avance merci
Didier Bozonnet

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: lubridate ou timetk:extraction plage horaire a cheval sur 2 jours

Messagepar Logez Maxime » 08 Nov 2023, 08:25

Bonjour,

je ne suis pas très familier avec lubridate, mais voilà une possibilité :

Code : Tout sélectionner

# pour l'exemple :
dta <- data.frame(time = seq(ymd_hms("20230201 000000"), ymd_hms("20230205 230000"), by = "hour"))

# si on définit une nuit comme allant de 22h00 à 08h00
auxi <- dta %>%
  mutate(day = as_date(time)) %>%
  filter(!duplicated(day)) %>%
  mutate(start = ymd_hms(paste(day, "22:00:00")), end = start + 10*3600, int = interval(start, end)) %>%
  pull(int)

# auxi contient des intervalles de temps qui définissent chaque nuit
dta %>%
  mutate(test = time %within% as.list(auxi))
Cordialement,
Maxime

Didier Bozonnet
Messages : 60
Enregistré le : 04 Fév 2012, 12:35

Re: lubridate ou timetk:extraction plage horaire a cheval sur 2 jours

Messagepar Didier Bozonnet » 08 Nov 2023, 11:04

Merci Maxime pour votre aide. Je vais attendre un peu pour voir si qqn me fait quelque chose avec lubritdate ou timetk. Car comme je sui pas très familier et que c'est pas mon métier je peux pas intégrer toutes les connaissances possible
Par avance merci
Didier Bozonnet

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: lubridate ou timetk:extraction plage horaire a cheval sur 2 jours

Messagepar Logez Maxime » 09 Nov 2023, 09:32

Bonjour,

Juste pour signaler que le code que j'ai fourni est entièrement basé sur lubridate pour la gestion du temps (date, heure, etc.), avec des fonctions comme ymd_hms, as_date, interval et %within%. Le reste ce sont des fonctions de dplyr déjà mentionnées pour la plupart.

Cordialement,
Maxiem

Didier Bozonnet
Messages : 60
Enregistré le : 04 Fév 2012, 12:35

Re: lubridate ou timetk:extraction plage horaire a cheval sur 2 jours

Messagepar Didier Bozonnet » 22 Nov 2023, 07:08

Merci Maxime; je me penche sur votre solution dès que je le peux. bien à vous .Didier
Par avance merci
Didier Bozonnet

Didier Bozonnet
Messages : 60
Enregistré le : 04 Fév 2012, 12:35

Re: lubridate ou timetk:extraction plage horaire a cheval sur 2 jours

Messagepar Didier Bozonnet » 06 Déc 2023, 08:41

Bonjour Maxime
Comme votre code me renvoyait des erreurs que je ne comprends absolument pas j'ai découvert la fonction between

Au lieu de filtrer en voulant conserver les données entre minuit et 9h de matin avec ce code:

Code : Tout sélectionner

filter((heure>= as_hms(0) & heure<as_hms(32400)))
; 0 = 0*3600s ;32400 = 9*3600 s

j'ai codé EN SUPPRIMANT les données entre 8h du matin (8*3600 = 28800) et 22h (22*3600=79200) avec ce code:

Code : Tout sélectionner

filter(!between(heure,28800,79200))


au final mon code pour obtenir le bon tibble est

Code : Tout sélectionner

ini<-read_csv2("tumocong5_oct2023_ini.csv", col_names = c("date","temp" ), col_types= list("?","?"), skip = 2)%>%
  filter(!is.na(temp))%>%
    mutate(DaTime = dmy_hm(date),   
         date = as.Date(DaTime),
         heure=as_hms(DaTime))%>%
  dplyr::select(date,heure,temp,) %>%
 filter(!between(heure,28800,79200))


Je vous remercie néanmoins de vos conseils; J'ai bloqué durant un moment mais pour un novice je suis fier de moi d'avoir trouvé.
Passez un bonne fin d'année
A bientôt
Didier
Par avance merci
Didier Bozonnet


Retourner vers « Questions en cours »

Qui est en ligne

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