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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Janvier 2022
    Messages : 5
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    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)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Janvier 2022
    Messages : 5
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    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") ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Janvier 2022
    Messages : 5
    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
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Janvier 2022
    Messages : 5
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    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})
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    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 : 662
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    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
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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