déterminer la période de temps en Jour ou Nuit

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

NGUYEN Maxime
Messages : 17
Enregistré le : 22 Mar 2017, 07:51

déterminer la période de temps en Jour ou Nuit

Messagepar NGUYEN Maxime » 22 Mar 2017, 09:17

Bonjour,

j'ai le tableau avec une colonne (date et heure). Je voudrais convertir deux colonne:

_ une pour la Date
_ l'autre pour Phase : qui a deux valeur "jour" ( entre 8h et 22h) et "nuit " (a partir de 22h jusqu'à 8h).

De plus, j'ai une autre colonne "Fréquence". Je voudrais convertit en 3 colonnes : min, médiane, max

Je vous présente ma colonne
Time Fréquence
09/02/2013 10:14 20.6 -> max
09/02/2013 09:14 14.6 -> min
09/02/2013 08:14 19.0 -> médiane

09/02/2013 07:14 15.0 -> il y une seule valeur donc c'est simultanément min=max=médiane.
09/02/2013 06:14 0.0
09/02/2013 05:14 0.0
09/02/2013 04:14 0.0
09/02/2013 03:14 0.0
09/02/2013 02:14 0.0
09/02/2013 01:14 0.0
09/02/2013 00:14 0.0
08/02/2013 23:14 0.0
08/02/2013 22:14 0.0
08/02/2013 21:14 0.0
08/02/2013 20:14 0.0

08/02/2013 19:14 0.0
08/02/2013 18:14 0.0
08/02/2013 17:14 19.0
08/02/2013 16:14 16.0
08/02/2013 15:14 0.0
08/02/2013 14:14 13.8 -> min
08/02/2013 13:14 0.0
08/02/2013 12:14 15.4
08/02/2013 11:14 15.4
08/02/2013 10:14 0.0
08/02/2013 09:14 30.8 -> max
08/02/2013 08:14 26.4


Je veux l'affichage comme ça
date Phase Fréquence.min Fréquence.médiane Fréquence.max
09/02/2013 jour 14.6 19.0 20.6
08/02/2013 nuit 15 15 15
08/02/2013 jour 3.8 17.5 30.8

Merci pour votre aide.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: déterminer la période de temps en Jour ou Nuit

Messagepar Pierre-Yves Berrard » 22 Mar 2017, 11:33

Bonjour, une solution pour la première question :

Code : Tout sélectionner

Time <- c("09/02/2013 23:51", "10/02/2013 13:37", "11/02/2013 04:14")
Time_ct <- as.POSIXct(Time, format = "%d/%m/%Y %H:%M", tz = "GMT")

Date_ <- as.Date(Time_ct)
h_depuis_minuit <- as.numeric(Time_ct) %% 86400 / 3600 # (Time_ct est le nombre de secondes depuis 01/01/1970)
Phase <- ifelse(h_depuis_minuit >= 8 & h_depuis_minuit < 22, "jour", "nuit")
PY

NGUYEN Maxime
Messages : 17
Enregistré le : 22 Mar 2017, 07:51

Re: déterminer la période de temps en Jour ou Nuit

Messagepar NGUYEN Maxime » 22 Mar 2017, 13:14

@ Pierre-Yves Berrard : Merci beaucoup pour votre aide. Votre code marche très bien. Est ce que vous pourriez m'aider pour 2eme question ? SVP

Merci.

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

Re: déterminer la période de temps en Jour ou Nuit

Messagepar Logez Maxime » 22 Mar 2017, 14:57

Bonjour,

Une possibilité :

Code : Tout sélectionner

tab2 <- tab %>% mutate(Time = as.POSIXct(Time, format = "%d/%m/%Y %H:%M"), Jour = format(Time, "%d/%m/%Y"), Periode = c("nuit", "jour")[(format(Time, "%H") %in% sprintf("%02d",8:21))+1])

tab2 %>% select(-Time) %>% group_by(Jour, Periode) %>% filter(Fréquence > 1e-7) %>% summarise_each(funs(min, median, max))
Source: local data frame [3 x 5]
Groups: Jour [?]

        Jour Periode   min median   max
       <chr>   <chr> <dbl>  <dbl> <dbl>
1 08/02/2013    jour  13.8     16  30.8
2 09/02/2013    jour  14.6     19  20.6
3 09/02/2013    nuit  15.0     15  15.0
Cordialement,
Maxime

NGUYEN Maxime
Messages : 17
Enregistré le : 22 Mar 2017, 07:51

Re: déterminer la période de temps en Jour ou Nuit

Messagepar NGUYEN Maxime » 22 Mar 2017, 15:49

@Logez Maxime : Bonjour , merci votre réponse.
pour le première étape , ca marche bien

Code : Tout sélectionner

tab2 <- tab %>% mutate(Time = as.POSIXct(Time, format = "%d/%m/%Y %H:%M"), Jour = format(Time, "%d/%m/%Y"), Periode = c("nuit", "jour")[(format(Time, "%H") %in% sprintf("%02d",8:21))+1])


Par contre, 2ème étape, ca marche pas pour moi , il affiche :"There were 50 or more warnings (use warnings() to see the first 50".

Donc je pense que c'est la problème de variable " Fréquence" est factor, donc j'ai déjà essayé de convertir en numérique avant que d'effectuer 2eme code. Mais ca marche pas toujours, il affiche "Error in summarise_impl(.data, dots) : ‘min’ not meaningful for factors".

Cordialement.

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

Re: déterminer la période de temps en Jour ou Nuit

Messagepar Logez Maxime » 23 Mar 2017, 08:29

Bonjour,

Alors il te faut regarder pourquoi cette variable qui apparemment est une variable quantitative a été considérée comme une variable qualitative. Est-ce que tu n'as pas un mélange de . et de , dans ta colonne, ou est-ce qu'il n'y a pas des espaces qui se baladent, etc.

Cordialement,
Maxime

NGUYEN Maxime
Messages : 17
Enregistré le : 22 Mar 2017, 07:51

Re: déterminer la période de temps en Jour ou Nuit

Messagepar NGUYEN Maxime » 23 Mar 2017, 09:11

Bonjour,

@ Logez Maxime : c'est vrai dans le tableau , encore l'autre variable factor , donc le code ne marche pas , après je les éliminé , le code marche très bien.
Vraiment merci beaucoup votre aide.Je peux apprendre beaucoup de nouvelles parce que je suis encore débutant R


Par contre, encore petit problème. En effet , certaine périodes ont seulement les valeurs 0 (min=max=médiane=0) donc je ne veux pas perdre les lignes pour tableau finale à cause de filter(Frequence > 1e-7), donc je veux afficher "min=max=médiane= 0= NA".

De plus, quand je regarde les valeurs de chaque colonne "min, max, médiane", je trouve la colonne max est bon , par contre les valeurs des colonnes min et médiane ne sont pas corrects.


Merci encore
PS : si je pose trop de questions , je m'excuse
Cordialement.

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

Re: déterminer la période de temps en Jour ou Nuit

Messagepar Logez Maxime » 23 Mar 2017, 14:06

Bonjour,

si tu as des variables de différents types (factor, numeric, etc.) et que tu ne veux faire le résumer que sur les variables numériques alors tu peux utiliser la fonction summarise_if plutôt que summarise_all :

Code : Tout sélectionner

tab2 %>% select(-Time) %>% group_by(Jour, Periode) %>% filter(Fréquence > 1e-7) %>% summarise_if(is.numeric, funs(min, median, max))
Si tu veux conserver les NA plutôt que les supprimer voilà une solution, je pense que l'on peut faire plus simple :

Code : Tout sélectionner

tab2 %>% select(-Fréquence, -Time) %>% group_by(Jour, Periode) %>% slice(1) %>%
  left_join(tab2 %>% filter(Fréquence > 1e-7) %>% group_by(Jour, Periode) %>% summarise_if(is.numeric, funs(min,median,max)))
Joining, by = c("Jour", "Periode")
Source: local data frame [4 x 5]
Groups: Jour, Periode [?]

        Jour Periode   min median   max
       <chr>   <chr> <dbl>  <dbl> <dbl>
1 08/02/2013    jour  13.8     16  30.8
2 08/02/2013    nuit    NA     NA    NA
3 09/02/2013    jour  14.6     19  20.6
4 09/02/2013    nuit  15.0     15  15.0
Cordialement,
Maxime

NGUYEN Maxime
Messages : 17
Enregistré le : 22 Mar 2017, 07:51

Re: déterminer la période de temps en Jour ou Nuit

Messagepar NGUYEN Maxime » 24 Mar 2017, 13:13

@ Logez Maxime : Bonjour, merci pour la rapidité de votre réponse.

Par contre, après vérifier les valeurs des colonnes min et médiane. Je trouve que les valeurs de NUIT affichent pas correctement. Je comprend pourquoi ils ne sont pas correctement,

parce que group_by(Jour, Periode) ----> NUiT : il va chercher la valeur min entre 24h00-7h59 et plus 22h-24h du soir,

Mais je veux que la valeur NUIT qui compte la valeur min seulement 22h-7h59 et pas avec 22h-24h.
Ex:
08/02/2013 07:14:34 nuit 20.6
08/02/2013 06:14:34 nuit 0.0
08/02/2013 04:18:21 nuit 0.0
08/02/2013 03:18:22 nuit 0.0
08/02/2013 02:18:22 nuit 24.0
08/02/2013 01:18:22 nuit 0.0
08/02/2013 00:18:21 nuit 15.0
07/02/2013 23:18:22 nuit 14.8
07/02/2013 22:18:22 nuit 14.6

07/02/2013 21:18:22 jour 11.2
07/02/2013 20:18:22 jour 11.2
07/02/2013 19:18:22 jour 11.8
07/02/2013 18:18:22 jour 11.2
07/02/2013 17:18:22 jour 17.8
07/02/2013 16:18:22 jour 16.6
07/02/2013 15:18:22 jour 12.4
07/02/2013 14:18:22 jour 13.0
07/02/2013 13:18:22 jour 16.4
07/02/2013 12:18:22 jour 11.0
07/02/2013 11:18:22 jour 12.6
07/02/2013 10:18:22 jour 11.8
07/02/2013 09:18:22 jour 13.6
07/02/2013 08:18:22 jour 15.8

07/02/2013 07:18:22 nuit 14.8
07/02/2013 06:18:22 nuit 0.0
07/02/2013 05:18:22 nuit 24.6
07/02/2013 04:18:22 nuit 0.0
07/02/2013 03:18:22 nuit 0.0
07/02/2013 02:18:22 nuit 0.0
07/02/2013 01:18:22 nuit 0.0
07/02/2013 00:18:22 nuit 0.0
06/02/2013 23:18:22 nuit 15.0
06/02/2013 22:18:22 nuit 15.4


Résultat correct : 08/02/2013 : NUIT / min médiane max
14.6 15.0 24
07/02/2013 : NUIT 14.8 15.2 24.6
Mais selon votre code résultat est 08/02/2013 : NUIT / min médiane max
15 20.6 24
07/02/2013 : NUIT 14.6 14.8 24.6
il laisse deux valeur 14.6 et 14.8 qui comptent pour la nuit 07/02/2013

De plus, je ne comprend pas le rôle de %>% slice(1) %>% dans votre code.


Merci
Cordialement

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

Re: déterminer la période de temps en Jour ou Nuit

Messagepar Logez Maxime » 24 Mar 2017, 14:52

re,

Si tu modifies tab2 avec le code suivant ça devrait pouvoir fonctionner :

Code : Tout sélectionner

 tab2 <- tab %>% mutate(Time = as.POSIXct(Time, format = "%d/%m/%Y %H:%M"), Jour = ifelse(format(Time, "%H") %in% sprintf("%02d", 0:7), format(Time - 24*3600, "%d/%m%/%Y"), format(Time, "%d/%m/%Y")), Periode = c("nuit", "jour")[(format(Time, "%H") %in% sprintf("%02d",8:21))+1])
Cordialement,
Maxime

NGUYEN Maxime
Messages : 17
Enregistré le : 22 Mar 2017, 07:51

Re: déterminer la période de temps en Jour ou Nuit

Messagepar NGUYEN Maxime » 28 Mar 2017, 14:59

@ Logez Maxime : Bonjour, votre code n'a pas marché . Maintenant dans la colonne PERIODE, les valeurs renversent, c'est-à dire , Nuit devient jour et jour devient nuit.

Code : Tout sélectionner

tab2 <- tab %>% mutate(Time = as.POSIXct(Time, format = "%d/%m/%Y %H:%M"), Jour = ifelse(format(Time, "%H") %in% sprintf("%02d", 0:7), format(Time - 24*3600, "%d/%m%/%Y"), format(Time, "%d/%m/%Y")), Periode = c("nuit", "jour")[(format(Time, "%H") %in% sprintf("%02d",8:21))+1])


J'ai essayé de corriger , mais je ne peux pas. C'est pour la raison que je répond tard à votre réponse.

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

Re: déterminer la période de temps en Jour ou Nuit

Messagepar Logez Maxime » 28 Mar 2017, 18:48

En fait tout dépend de ce que tu considères être la nuit. Si la nuit du 07/02/2013 c'est du 06/02/2013 22:00:01 au 07/02/2013 07:59:59 alors tu peux faire comme ça :

Code : Tout sélectionner

tab2 <- tab %>% mutate(Time = as.POSIXct(Time, format = "%d/%m/%Y %H:%M"),
                       Jour = ifelse(format(Time, "%H") %in% sprintf("%02d", 22:23),
                                     format(Time + 24*3600, "%d/%m%/%Y"), format(Time, "%d/%m/%Y")),
                       Periode = c("nuit", "jour")[(format(Time, "%H") %in% sprintf("%02d",8:21))+1])

tab2 %>% select(-Fréquence, -Time) %>% group_by(Jour, Periode) %>% slice(1) %>%
  left_join(tab2 %>% filter(Fréquence > 1e-7) %>% group_by(Jour, Periode) %>% summarise_if(is.numeric, funs(min,median,max)))
 Joining, by = c("Jour", "Periode")
Source: local data frame [3 x 6]
Groups: Jour, Periode [?]

      YY       Jour Periode   min median   max
  <fctr>      <chr>   <chr> <dbl>  <dbl> <dbl>
1   jour 07/02/2013    jour  11.0   12.5  17.8
2   nuit 07/02/2013    nuit  14.8   15.2  24.6
3   nuit 08/02/2013    nuit  14.6   15.0  24.0

Si par contre la nuit du 07/02 c'est du 07/02/2013 22:00:01 au 08/02/2013 07:59:59 alors tu peux faire comme ça :

Code : Tout sélectionner

tab2 <- tab %>% mutate(Time = as.POSIXct(Time, format = "%d/%m/%Y %H:%M"),
                       Jour = ifelse(format(Time, "%H") %in% sprintf("%02d", 0:7),
                                     format(Time - 24*3600, "%d/%m%/%Y"), format(Time, "%d/%m/%Y")),
                       Periode = c("nuit", "jour")[(format(Time, "%H") %in% sprintf("%02d",8:21))+1])

tab2 %>% select(-Fréquence, -Time) %>% group_by(Jour, Periode) %>% slice(1) %>%
  left_join(tab2 %>% filter(Fréquence > 1e-7) %>% group_by(Jour, Periode) %>% summarise_if(is.numeric, funs(min,median,max)))
Joining, by = c("Jour", "Periode")
Source: local data frame [3 x 6]
Groups: Jour, Periode [?]

      YY       Jour Periode   min median   max
  <fctr>      <chr>   <chr> <dbl>  <dbl> <dbl>
1   nuit 06/02/2013    nuit  14.8   15.2  24.6
2   jour 07/02/2013    jour  11.0   12.5  17.8
3   nuit 07/02/2013    nuit  14.6   15.0  24.0
Cordialement,
Maxime

NGUYEN Maxime
Messages : 17
Enregistré le : 22 Mar 2017, 07:51

Re: déterminer la période de temps en Jour ou Nuit

Messagepar NGUYEN Maxime » 29 Mar 2017, 08:17

@ Logez Maxime : Bonjour, c'est incroyable pour votre code. Finalement , j'ai trouvé la solution pour mon problème. Donc, je peux fermer cette topic .

Merci beaucoup pour votre gentillesse.


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité