Pandas différence de dates et graphes

Utilisation de Matplotlib

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Dans un dataframe Pandas, j’ai un certains nombre de données dont deux champs (datedebut, datefin).

J’ai pu faire la différence entre ces deux dates et convertir le résultat en nombre de seconde. Le résultat est mis dans un nouveau champ 'delais’

A partir de ce champ, grace à df.apply, j’ai réussi à regrouper les données en fonction du plage de temps (1heures, 3heures, 4 jours, 2 semaines, 1 mois etc….) J’obtiens donc un nouveau dataframe df2 qui est sous cette forme :

;delais;result

3;14;0 heure(s)

53;1798;0 heure(s)

54;1825;1 heure(s)

55;1858;1 heure(s)

383;85598;24 heure(s)

384;85885;24 heure(s)

385;86457;1 jour(s)

386;86531;1 jour(s)

484;250276;3 jour(s)

485;250424;3 jour(s)

526;336779;4 jour(s)

528;337710;4 jour(s)

delais est exprimé en secondes

Ce que je voudrais faire, c’est d’effectuer un grouby, pour compter mes valeurs, puis tracer un plot du résultat. Jusque là j’arrive à faire ce que je veux. Malheuresement, le résultat du group by ne respecte par 'le temps’ et je me retrouve avec une ligne 1 heure, puis 1 smeines, puis 2 heures etc…. Du coup, je n’arrive pas à avoir un résultat et donc un graphe utilisable.

Auriez vous un indice à me donner. Je tourne en rond et je n’arrive pas à m’en sortir.

Merci d’avance et Bonne journée à tous

Bonjour :)

Pourrais-tu nous montrer le code que tu as essayé pour l’instant et qui ne semble pas fonctionner pour que l’on puisse t’aider ? Tu peux l’inclure avec le bouton "Bloc de code coloré" dans la barre d’outils et en collant ton code entre les paires d’accents graves qui apparaissent.

Bonjour Vanadiee,

voici le code :

def calcDelais(row):
    var =(row['date_fin']-row['date_debut'])/np.timedelta64(1,'D')      
    if var > 30:
        return f"{round((row['date_fin']-row['date_debut'])/np.timedelta64(1,'M'))} mois"
    elif var > 7 and var <= 30:
        return f"{round((row['date_fin']-row['date_debut'])/np.timedelta64(1,'W'))} semaines(s)"
    elif var > 1 and var <= 7:
        return f"{round(var)} jour(s)"
    else :
        return f"{round((row['date_fin']-row['date_debut'])/np.timedelta64(1,'h'))} heure(s)"

df['result'] = df.apply(calcDelais, axis=1)
df['delais'] = ((df['date_fin']- df['date_debut'])/np.timedelta64(1,'s')).astype(int)
df = df.sort_values(by='delais', ascending = True).reset_index().reindex()
df2 = df[['delais', 'result']].copy()
df2

La partie CalcDelais est à affiner pour avoir des résultats plus "jolis", mais globalement ce sera comme cela.

Merci de ton aide

Ce que je voudrais faire, c’est d’effectuer un grouby, pour compter mes valeurs, puis tracer un plot du résultat. Jusque là j’arrive à faire ce que je veux. Malheuresement, le résultat du group by ne respecte par 'le temps’ et je me retrouve avec une ligne 1 heure, puis 1 smeines, puis 2 heures etc…. Du coup, je n’arrive pas à avoir un résultat et donc un graphe utilisable.

Je ne comprends pas bien ce que tu essaies de faire (notamment "group by" oui, mais sur quel critère?). Lorsque tu fais ton tri avec df.sort_value(by='delais', ascending=true), ça trie par ordre croissant et surtout alphabétique, c’est pour ça que ça fait "1 heure" puis "1 semaine" puis "2 heures". Je me demande pourquoi est-ce que tu tries les delais "joli" (formaté pour la lecture par un humain) alors que tu souhaites tracer une courbe avec par la suite. Il suffirait de trier uniquement les délais non formatés (donc dans calcDelai simplement mettre f"{round((row['date_fin']-row['date_debut'])/np.timedelta64(1,'M'))}" sans le " mois" ou "semaine(s)", etc.) puis de tracer ta courbe avec les secondes. Si ça n’est pas ce que tu souhaites faire alors il faut que tu clarifies le paragraphe sus-cité pour que comprendre mieux ce que souhaites faire.

@adri1 : Effectivement, je n’avais pas percuter sur le groupBy avec un trie par défaut.

Le sort à false règle parfaitement le problème.

Depuis j’ai un problème avec mon graphe matplotlib, mais je vais essayer de le régler avant de faire une suite à mon post.

Bonne soirée à tous

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte