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 :

Faire un plot avec les heures en abscisse ou la date+heure en abscisse


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Points : 8
    Points
    8
    Par défaut Faire un plot avec les heures en abscisse ou la date+heure en abscisse
    Bonjour à tous,

    J'aimerais pouvoir faire un plot avec un fichier de données qui contient 3 colonnes : le jour (format day-month-year), l'heure (format Hour-minutes-secondes), et une donnée en troisième colonne.
    J'ai deux fichiers, un qui contient les dernières 24h et un qui contient les 7 derniers jours.
    Pour le fichier des dernières 24h je peux faire l'impasse sur le jour et je voudrais obtenir un plot de cette donnée avec la deuxième colonne en abscisse.
    J'ai cherché des tutos sur le web mais j'ai du mal à obtenir un résultat...

    Voilà mon début de code :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    # coding: utf-8
    import glob
    import base64
    import csv
    import sys
    import os
    import time
    from datetime import datetime
    from pathlib import Path
    import smbus as smbus
     
    from tkinter import * 
    import tkinter as tk
    import tkinter.ttk as ttk
     
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    import matplotlib.dates
     
     
    current_datetime = datetime.now()
    current_date = current_datetime.strftime("%B%Y") 
    Mois=['janvier','février','mars','avril','mai','juin','juillet','aout','septembre','octobre','novembre','décembre']
    mois = current_datetime.date().month
    Q = Mois[mois-1]
    current_date = Q + current_datetime.strftime("%Y") 
     
    Record_dir = '/home/pi/Domotique/Donnees_Temperature/' + current_date
    Record_file_Temperature = Record_dir + f"/{current_date}.txt"
    Day_File_Salon = Record_dir + f"/Data_Temp_Day_Salon.txt"
    Day_File_Chambre = Record_dir + f"/Data_Temp_Day_Chambre.txt"
    Day_File_ECS = Record_dir + f"/Data_Temp_Day_ECS.txt"
     
     
     
    data_plot_Salon_24H = pd.read_csv(Day_File_Salon)
    print(data_plot_Salon_24H.shape)
    #data_plot_Salon_24H.tail()
     
    x = data_plot_Salon_24H.iloc[0:len(data_plot_Salon_24H), 1:2] 
    y = data_plot_Salon_24H.iloc[0:len(data_plot_Salon_24H), 2:3] 
    print(x)
    print(y)
     
    dates = matplotlib.dates.date2num(x)
    plt.plot_date(dates, y)
    plt.show()
     
     
     
    #x,y = (data_plot_Salon_24H[:]),(data_plot_Salon_24H[:,2])
    #plt.plot(x,y)
    # beautify the x-labels
    #plt.gcf().autofmt_xdate()
     
     
     
     
     
    #Plot temperature
    #data_plot_Salon_24H[:,1] = pd.to_datetime(data_plot_Salon_24H[:,1])
    #x=data_plot_Salon_24H[:,0]
     
    #y=data_plot_Salon_24H[:,2]
    #plt.plot(x, y)
     
    #fig, ax = plt.subplots()
    #ax1 = fig.add_subplot(211)
    #ax1.bar(x, y, align='center')
     
    #ax2 = fig.add_subplot(212)
    #ax2.bar(range(len(y)), y, align='center')
    #plt.xticks(range(len(x)), x)
     
    # Définir les emplacements et les étiquettes des marqueurs d'axe
    #ax.set_xticks(data_plot_Salon_24H[:,1])
    #ax.set_xticklabels(data_plot_Salon_24H[:,1].dt.strftime("%H:%M:%S"))
    et le fichier source :Data_Temp_Day_Salon.7z

    La ligne dates = matplotlib.dates.date2num(x) renvoie une erreur :
    Traceback (most recent call last):
    File "/home/pi/Domotique/Programmes/Interface_graphique_test.py", line 59, in <module>
    dates = matplotlib.dates.date2num(x)
    File "/home/pi/.local/lib/python3.7/site-packages/matplotlib/dates.py", line 446, in date2num
    d = d.astype('datetime64[us]')
    ValueError: Error parsing datetime string "22:36:54" at position 2

    Ça fait maintenant un bon moment que je cherche et que j'essaie plein de trucs mais je ne trouve pas de solution. Auriez-vous une solution, un bon tuto pour faire des plot avec la date/heure en abscisse ?


    Merci d'avance

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 920
    Points : 7 312
    Points
    7 312
    Par défaut
    Bonsoir,

    L'erreur que vous rencontrez se produit parce que matplotlib.dates.date2num attend des objets datetime, mais vous lui fournissez des chaînes de caractères représentant uniquement les heures. Pour résoudre ce problème, il est nécessaire de convertir la colonne des heures en format datetime correct avant de les utiliser pour le tracé.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Points : 8
    Points
    8
    Par défaut
    Merci fred1599 pour ta réponse.

    quand tu dis qu'il attend un objet datetime tu veux dire une date complète ?

    Comme ça ? : 2019-04-01 11:15:15.068664

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    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 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Bonjo
    Citation Envoyé par Toine74 Voir le message
    quand tu dis qu'il attend un objet datetime tu veux dire une date complète ?

    Comme ça ? : 2019-04-01 11:15:15.068664
    Non, il a ben dit "un objet datetime" !!! Là tu montres un objet str
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> from datetime import datetime
    >>> d=datetime.strptime("2019-04-01 11:15:15", "%Y-%m-%d %H:%M:%S")
    >>> d, type(d)
    (datetime.datetime(2019, 4, 1, 11, 15, 15), <class 'datetime.datetime'>)
    >>>

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Points : 8
    Points
    8
    Par défaut
    Oui pardon je me suis mal exprimé.

    Je voulais savoir si l'objet datetime devait contenir date+heure et c'est le cas en relisant la doc et vos réponses. Et merci Sve@r pour le datetime.strptime c'est exactement ce que je cherchais !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Points : 8
    Points
    8
    Par défaut
    Je reviens vers vous car j'ai un souci quand je crée ma liste d'objets datetime pour ensuite en faire un plot.
    Pour cela je concatène la premiere colonne (jour-mois-année) et la deuxième (heure:minute:seconde) pour créer un objet datetime

    si j'applique cela à une ligne seule cela marche bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data_plot_Salon_24H = pd.read_csv(Day_File_Salon)
    d = datetime.strptime(data_plot_Salon_24H.iloc[1,0] + " " + data_plot_Salon_24H.iloc[1,1], "%d-%m-%Y %H:%M:%S")
    print(d, type(d))
    j'obtiens en sortie :
    2024-04-11 22:37:26 <class 'datetime.datetime'>
    Mais lorsque je veux faire un tableau qui rassemble toutes les lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tableau_plot_24h_x = np.empty(len(data_plot_Salon_24H), dtype='M')
    for i in range(0, len(data_plot_Salon_24H), 1): 
        Tableau_plot_24h_x[i] = datetime.strptime(data_plot_Salon_24H.iloc[i,0] + ' ' + data_plot_Salon_24H.iloc[i,1], "%d-%m-%Y %H:%M:%S")
    j'obtiens en sortie une erreur qui vient du fait que je dois rajouter un espace entre les deux string pour construire l'objet datetime :

    Tableau_plot_24h_x[i] = datetime.strptime(data_plot_Salon_24H.iloc[i,0] + ' ' + data_plot_Salon_24H.iloc[i,1], "%d-%m-%Y %H:%M:%S")
    TypeError: Cannot cast datetime.datetime object from metadata [us] to according to the rule 'same_kind'
    si j'enlève l'espace entre les deux string j'obtiens :
    ValueError: time data '11-04-202422:36:54' does not match format '%d-%m-%Y %H:%M:%S'
    En lisant la doc sur dtype je vois que l'on peut 'construire' un dtype structuré qui prend en compte les différents formats mais j'ai du mal à trouver la bonne syntaxe, savez-vous comment faire ?

    Merci d'avance

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    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 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    j'obtiens en sortie une erreur qui vient du fait que je dois rajouter un espace entre les deux string pour construire l'objet datetime :

    Tableau_plot_24h_x[i] = datetime.strptime(data_plot_Salon_24H.iloc[i,0] + ' ' + data_plot_Salon_24H.iloc[i,1], "%d-%m-%Y %H:%M:%S")
    TypeError: Cannot cast datetime.datetime object from metadata [us] to according to the rule 'same_kind'
    Tableau_plot_24h_x[i] = datetime.strptime("%s %s" % (data_plot_Salon_24H.iloc[i,0], data_plot_Salon_24H.iloc[i,1]), "%d-%m-%Y %H:%M:%S")...

    Citation Envoyé par Toine74 Voir le message
    si j'enlève l'espace entre les deux string j'obtiens :
    ValueError: time data '11-04-202422:36:54' does not match format '%d-%m-%Y %H:%M:%S'
    Et tu ne t'es pas dit qu'il fallait enlever en parallèle ce même espace entre "%Y" et "%H" Il est où ton esprit déductif ???

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Points : 8
    Points
    8
    Par défaut
    Bien sûr que si je l'ai fait je suis très loin d'être un pro de la programmation mais quand même ^^ ...
    J'obtiens la même erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau_plot_24h_x[i] = datetime.strptime(data_plot_Salon_24H.iloc[i,0] + data_plot_Salon_24H.iloc[i,1], "%d-%m-%Y%H:%M:%S")
    TypeError: Cannot cast datetime.datetime object from metadata [us] to according to the rule 'same_kind'
    Ainsi qu'avec la ligne de code que tu m'as donnée, toujours la même erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau_plot_24h_x[i] = datetime.strptime("%s %s" % (data_plot_Salon_24H.iloc[i,0], data_plot_Salon_24H.iloc[i,1]), "%d-%m-%Y %H:%M:%S")
    TypeError: Cannot cast datetime.datetime object from metadata [us] to according to the rule 'same_kind'

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Points : 8
    Points
    8
    Par défaut
    Du coup j'ai écris un bout de code qui lit le fichier et rassemble ligne par ligne les deux premières colonnes et les réécrit sous forme d'objet datetime, le tout à base de readline() et split() et ça marche nickel.

    Le fichier produit : Data_Temp_Day_Salon2.7z

    Si je modifie la fonction qui produit le fichier de données 24h avec directement la première colonne dans le bon format datetime pour un plot ça évitera de devoir relire le fichier pour le modifier après sa création.

    Mais si vous avez une explication pour les erreurs quand je fais ça à base de numpy je suis preneur.

    Du coup la commande : dates = matplotlib.dates.date2num(x) marche très bien et la fenêtre du plot s'affiche mais pas le plot lui-même... J'ai comme erreur :
    TypeError: Couldn't find foreign struct converter for 'cairo.Context'
    On verra ça demain il est temps d'aller se coucher...

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    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 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Toine74 Voir le message
    Du coup j'ai écris un bout de code qui lit le fichier et rassemble ligne par ligne les deux premières colonnes et les réécrit sous forme d'objet datetime, le tout à base de readline() et split() et ça marche nickel.
    C'est ça la programation: relier les boites carrées à des trous ronds.

    Citation Envoyé par Toine74 Voir le message
    Mais si vous avez une explication pour les erreurs quand je fais ça à base de numpy je suis preneur.
    La fonction strptime() a pour but d'analyser une chaine selon le pattern indiqué pour sortir la date correspondant. Si la chaine est "17-12-2024" le pattern sera "%d-%m-%Y". Si la chaine est "24/12/17" le pattern doit être "%y/%m/%" (et tu noteras que "%Y" devient "%y", bref il faut être très rigoureux car derrière le truc qui analyse est, lui, très très con).
    Mais le premier paramètre doit-être un str. Or data_plot_Salon_24H.iloc[x,y] semble ne pas être un str. Et même quand on tente de le convertir en str via "%s" % ... ça ne marche pas (ou alors la chaine qui en résulte ne correspond pas à une chaine de date bien câblée).
    Un moyen de t'en assurer eût été d'afficher print(repr(data_plot_Salon_24H.iloc[i, 0]), type(data_plot_Salon_24H.iloc[i, 0]), str(data_plot_Salon_24H.iloc[i, 0])).

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 920
    Points : 7 312
    Points
    7 312
    Par défaut
    Bonjour,

    Citation Envoyé par Toine74
    TypeError: Couldn't find foreign struct converter for 'cairo.Context'
    Vous avez des solutions sur le net, copier coller simplement ce message sur votre moteur de recherches favoris.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Points : 8
    Points
    8
    Par défaut
    Merci pour vos réponses.

    Mais il y a tout de même un truc qui m'échappe...
    Le fichier initial regroupe les températures de plusieurs pièces dans un même fichier. La première colonne (date) et la deuxième colonne (heure) sont produites par les commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    current_date = current_datetime.strftime("%d-%m-%Y")
    current_time = current_datetime.strftime("%H:%M:%S")
    Ensuite un autre script sélectionne la ou les pièces que je veux et prépare un fichier qui sert de base à un plot.
    Si la création de l'objet datetime se fait par lecture des lignes via readlines() et rassemblement des deux première colonnes via la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Date = datetime.strptime("%s %s" % (lines_plot[i].split(",")[0], lines_plot[i].split(",")[1]), "%d-%m-%Y %H:%M:%S")
    ça se passe très bien mais si je lis le fichier via pd.read_csv que je crée un tableau numpy puis je le remplis via une boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data_plot_Salon_24H = pd.read_csv(Record_file_Temperature)
    Tableau_plot_24h_x = np.empty(len(data_plot_Salon_24H), dtype='M')
    for i in range(0, len(data_plot_Salon_24H), 1): 
        Tableau_plot_24h_x[i] = datetime.strptime("%s %s" % (data_plot_Salon_24H.iloc[i,0], data_plot_Salon_24H.iloc[i,1]), "%d-%m-%Y %H:%M:%S")
    Alors là ça bugue... Pourtant dans les deux cas le contenu est le même

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Aidant
    Secteur : Services à domicile

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    Points : 8
    Points
    8
    Par défaut
    Ca y est j'ai un plot !

    Par contre le trait est très gros, comme c'est une multitude de points reliés en eux, et je n'ai pas réussi à trouver comment en réduire la taille. Savez-vous ?

    Nom : Figure_2.jpeg
Affichages : 133
Taille : 30,1 KoNom : Figure_1.jpeg
Affichages : 129
Taille : 22,7 Ko

    De plus, en lisant le tutoriel du site sur Matplotlib et en voulant reproduire certaines commandes j'ai ajouté la ligne from pylab import * comme indiqué dans le tuto. Et là j'ai une erreur de conflit :
    current_datetime = datetime.now()
    AttributeError: module 'datetime' has no attribute 'now'

  14. #14
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 920
    Points : 7 312
    Points
    7 312
    Par défaut
    Bonjour,

    Citation Envoyé par Toine74
    current_datetime = datetime.now()
    AttributeError: module 'datetime' has no attribute 'now'
    Vous perdez beaucoup de temps à demander plutôt que de chercher, va falloir avoir ce réflexe un jour.

    https://stackoverflow.com/questions/...-attribute-now

    https://ivan.bessarabov.com/blog/pyt...oogle_vignette

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/01/2008, 04h57
  2. Comment faire un Select avec les formulaires sous Access?
    Par kesamba dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 21/11/2007, 10h57
  3. [débutant] faire un JAR avec les drivers JDBC
    Par korrigann dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 29/11/2006, 16h46
  4. Problème de calcul avec les heures
    Par smotte76 dans le forum Access
    Réponses: 12
    Dernier message: 28/04/2006, 20h21
  5. [forms 6i][8i] affecter SYSDATE AVEC les heures
    Par Magnus dans le forum Oracle
    Réponses: 5
    Dernier message: 14/02/2006, 14h27

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