Pandas différence de dates et graphes

Utilisation de Matplotlib

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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

+0 -0

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.

+0 -0
Auteur du sujet

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

+0 -0

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.

+0 -1

Cette réponse a aidé l’auteur du sujet

Ton problème est que groupby trie les groupes par défaut. En mettant l’argument sort à False, cela devrait fonctionner. Voir la doc, elle existe, il faut la lire !

Édité par adri1

I don’t mind that you think slowly, but I do mind that you are publishing faster. — W. Pauli

+0 -0
Auteur du sujet

Merci à vous pour vos remarques.

je vais partir dans ce sens là. Je reviens sur le forum dès que possible pour vous dire ce que j’ai pu tirer.

Bonne soirée à vous deux.

+0 -0
Auteur du sujet

@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

+0 -0
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