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

Résolu/Fermé
quizzzzz - Modifié le 21 janv. 2022 à 14:31
mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 - 21 janv. 2022 à 14:30
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 22744 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 1 mai 2024 1 477
20 janv. 2022 à 22:28
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 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 7 751
Modifié le 21 janv. 2022 à 14:31
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