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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    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 confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 111
    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 : 4 111
    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
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 851
    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 851
    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'>)
    >>>
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

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

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    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
    Membre actif
    Homme Profil pro
    Aidant
    Inscrit en
    Janvier 2024
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    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 confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 111
    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 : 4 111
    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.

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

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

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    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

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

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

    Informations forums :
    Inscription : Janvier 2024
    Messages : 55
    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 : 446
Taille : 30,1 KoNom : Figure_1.jpeg
Affichages : 439
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'

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 111
    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 : 4 111
    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