IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Générer une chaine de caractères en fonction d'un horaire


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2022
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Générer une chaine de caractères en fonction d'un horaire
    Bonjour,

    Je voudrai ajouter à mon data-frame une colonne qui précise sous forme de chaine de caractère une période dans la journée.
    Ca fait bien 16 heures que je boucle sur le sujet et je ne parviens pas à m'en sortir. Pourriez-vous m'aider s'il vous plait ?

    je voudrais donc ajouter une colonne 'Shift' qui prend les valeurs suivantes :
    'morning' si 05:30 < hh:mm =< 13:30
    'afternoon' si 13:30 < hh:mm =< 21:30
    'night' si 21:30 < hh:mm =< 05:30

    Voici le code pour générer un dataframe représentatif de ma situation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import pandas as pd
    import numpy as np
    import datetime as dt
    import time
     
    dates=['21/12/2021 10:05', '20/12/2021 14:10', '19/12/2021 23:01', '18/12/2021 00:00']
    sales=[200,300,400,200]
    df = pd.DataFrame({'Date':dates ,'Sales':sales})
    df['Date'] = pd.to_datetime(df['Date'],format='%d/%m/%Y %H:%M' ) 
    print(df)
    Date Sales people
    0 2021-12-21 10:05:00 200 jean
    1 2021-12-20 14:10:00 300 pierre
    2 2021-12-19 23:01:00 400 jerome
    3 2021-12-18 00:00:00 200 raoul

    Date datetime64[ns]
    Sales int64
    people object
    dtype: object

    Ma piste principale est ce type d'instruction mais je ne parviens pas à la faire fonctionner ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df['Shift'] = df.where(df.between_time(start_time='05:30', end_time='13:30'),'morning')
    merci de m'avoir lu ,

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par quizzzzz Voir le message
    Ma piste principale est ce type d'instruction mais je ne parviens pas à la faire fonctionner ! :
    df['Shift'] = df.where(df.between_time(start_time='05:30', end_time='13:30'),'morning')
    M'étonnerait que panda sache que la string "21/12/2021 10:05" est une date avec "10:05" qui serait l'heure. Donc ma piste à moi (ne connaissant pas panda) est de recoder le truc
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #!/usr/bin/env python3
    # coding: utf-8
     
    import pandas as pd
    import numpy as np
    import datetime as dt
    import time
     
    def periodDay(date):
    	(hh,mm)=map(int, date.split(" ")[1].split(":"))
    	d=hh*100+mm
    	if 530 < d < 1330: return "morning"
    	if 1330 < d < 2130: return "afternoon"
    	return "night"
    # periodDay()
     
    data=(
    	{"date" : "21/12/2021 10:05", "sales" : 200},
    	{"date" : "20/12/2021 14:10", "sales" : 300},
    	{"date" : "19/12/2021 23:10", "sales" : 400},
    	{"date" : "18/12/2021 00:00", "sales" : 200},
    )
    df = pd.DataFrame(
    	{
    		'Date': tuple(x["date"] for x in data),
    		'Sales': tuple(x["sales"] for x in data),
    		"shift" : tuple(map(periodDay, (x["date"] for x in data))),
    	}
    )
    df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y %H:%M' )
    print(df)

    Mais ça donne un résultat pas dégueu...

    Accessoirement, je préfère associer les datas qui vont ensemble plutôt que de les gérer séparément (plus facilement maintenable)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2022
    Messages : 5
    Points : 1
    Points
    1
    Par défaut ca marche, merci
    Super, ca semble bien marcher. Merci infiniment !

    ceci dit si quelqu'un connait la piste avec pd et datetime ca m'intéresserait d'avoir aussi la solution (j'aimerai comprendre pourquoi j'ai pas réussi!).

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par quizzzzz Voir le message
    (j'aimerai comprendre pourquoi j'ai pas réussi!).
    Tu as écrit df['Shift'] = df.where(df.between_time(start_time='05:30', end_time='13:30'),'morning'). Où se trouve le lien avec "21/12/2021 10:05" (donc avec la liste "date") ???

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2022
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tu as écrit df['Shift'] = df.where(df.between_time(start_time='05:30', end_time='13:30'),'morning'). Où se trouve le lien avec "21/12/2021 10:05" (donc avec la liste "date") ???
    Effectivement j'ai omis l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df = df.set_index('dates')
    Qui si j'ai bien compris passe 'Date' en index ce qui rendait le lien dont tu parle implicite.
    Sinon j'ai essayé de faire référence à 'Date' mais j'ai tout le temps des erreurs :-/

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2022
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    df = pd.DataFrame(
    	{
    		'Date': tuple(x["date"] for x in data),
    		'Sales': tuple(x["sales"] for x in data),
    		"shift" : tuple(map(periodDay, (x["date"] for x in data))),
    	}
    )
    Bonsoir,

    Si j'ai bien compris votre code, vous créez le df et la nouvelle colonne en même temps en appelant la fonction periodDay().

    Pourriez-vous me montrer comment coder l'appelle à cette fonction pour que la nouvelle colonne vienne s'ajouter au dataframe déjà existant dans le code qui expose ma problématique?

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par quizzzzz Voir le message
    Si j'ai bien compris votre code, vous créez le df et la nouvelle colonne en même temps en appelant la fonction periodDay().
    Je crée le df qui contient directement toutes les colonnes voulues

    Citation Envoyé par quizzzzz Voir le message
    Pourriez-vous me montrer comment coder l'appelle à cette fonction pour que la nouvelle colonne vienne s'ajouter au dataframe déjà existant dans le code qui expose ma problématique?
    Ben... c'est la même chose sauf qu'on prend les données directement dans "dates". Sans déconner, faudrait prendre un peu le temps d'apprendre Python...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    shift=tuple(map(periodDay, dates))
    df = pd.DataFrame({'Date':dates ,'Sales':sales, "shift":shift})

  8. #8
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 658
    Points : 1 158
    Points
    1 158
    Par défaut
    Salut,

    Je trouve la syntaxe pour filtrer un DataFrame toujours non-intuitive. Mais c'est possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    df.loc[df.between_time(start_time='05:30', end_time='13:30').index, 'Shift'] = 'morning'
    df.loc[df.between_time(start_time='13:30', end_time='21:30').index, 'Shift'] = 'afternoon'
    df.loc[df.between_time(start_time='21:30', end_time='05:30').index, 'Shift'] = 'night'
    A noter, lorsqu'aucune condition n'a été satisfaite, il y aura une valeur NaN dans le tableau. On peut empêcher cela en initiant une valeur par défaut pour la colonne 'Shift' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df['Shift'] = 'default'
    J

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Salut,

    Une autre façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import pandas as pd
     
    dates=['21/12/2021 10:05', '20/12/2021 14:10', '19/12/2021 23:01', '18/12/2021 00:00']
    sales=[200,300,400,200]
    df = pd.DataFrame({'Date':dates ,'Sales':sales})
    df['Date'] = pd.to_datetime(df['Date'],format='%d/%m/%Y %H:%M' )
     
    def get_shift(dt):
        hh, mm = dt.hour, dt.minute
        if (5, 30) <= (hh, mm) < (13,30):
            return  'morning'
        if (13, 30) <= (hh, mm) < (21, 30):
            return 'afternoon'
        return 'night'
     
    df['Shift'] = df['Date'].apply(get_shift)
    print(df)
    qui sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                     Date  Sales      Shift
    0 2021-12-21 10:05:00    200    morning
    1 2021-12-20 14:10:00    300  afternoon
    2 2021-12-19 23:01:00    400      night
    3 2021-12-18 00:00:00    200      night
    Dès qu'on sait faire une fonction qui retourne am, pm, night en fonction d'un datetime, la question devient comment l'utiliser avec Pandas.

    - W

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2022
    Messages : 5
    Points : 1
    Points
    1
    Par défaut merci à tous pour ces contributions,
    Merci d'avoir pris le temps de me répondre, ca m'aide bien.

Discussions similaires

  1. [C#] Comment inverser une chaine de caractères ?
    Par just1980 dans le forum Contribuez
    Réponses: 6
    Dernier message: 01/05/2011, 20h35
  2. Réponses: 3
    Dernier message: 01/02/2006, 18h26
  3. Réponses: 2
    Dernier message: 03/10/2005, 16h23
  4. Réponses: 2
    Dernier message: 14/01/2005, 15h40
  5. comment vider une chaine de caractère
    Par gaut dans le forum C
    Réponses: 13
    Dernier message: 12/09/2003, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo