Créer une colonne remplie en fonction d'horaire (datetime)

Résolu
quizzzzz -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

Je voudrais ajouter à mon
DataFrame
une colonne qui précise une période dans la journée sous forme de chaîne de caractère.
Ça 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 ajouter une colonne
'Shift'
qui prend les valeurs suivantes :
  • 'morning'
    si
    05:30 < time <= 13:30
    ;
  • 'afternoon'
    si
    13:30 < time <= 21:30
    ;
  • 'night'
    si
    21:30 < time <= 05:30
    ;


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

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')


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'
)


Merci de m'avoir lu
A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
je ferais plutôt:
def tts(mom):
    ttd=mom.time()
    if ttd < dt.time(5,30):
        r = "night"
    elif ttd < dt.time(13,30):
        r='morning'
    else:
        r="plus tard"
    return r
df["Shift"]=df['Date'].apply(tts)
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Bonjour,

À mon avis tu te compliques un peu la vie car tes dates sont sous forme de chaînes au lieu d'être sous forme de date. Alors certes tu peux t'en sortie à coup de pandas mais c'est un peu traîner un boulet pour rien, quand tout peut être fait en amont du chargement de la
DataFrame
.

Voici ce que je te propose
import pandas as pd
import datetime as dt

dates = [
    '21/12/2021 10:05',
    '20/12/2021 14:10',
    '19/12/2021 23:01',
    '18/12/2021 00:00'
]
dates = [
    dt.datetime.strptime(d, "%d/%m/%Y %H:%M")
    for d in dates
]
sales = [200, 300, 400, 200]
df = pd.DataFrame({
    "Date" : dates ,
    "Sales" : sales,
    "Shift" : [
        "morning" if dt.time(5, 30) < d.time() <= dt.time(13, 30) else
        "afternoon" if d.time() < dt.time(21, 30) else
        "night"
        for d in dates
    ]
})
print(df)

... ce qui donne :
                 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 afternoon

Bonne chance
0