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 :

Moyenne de valeur pour chaque intervalle de temps


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Moyenne de valeur pour chaque intervalle de temps
    Bonsoir,

    Je reprends une nouvelle discussion pour vous expliciter mon probleme...J ai un fichier texte suivant :
    Time of acquisition ch0 ch1
    03:53:32 22.82 15.70
    03:44:01 22.68 15.70
    03:39:16 22.97 15.70
    03:34:30 22.99 15.50
    03:23:24 22.66 15.40
    03:18:38 22.82 14.30
    03:13:53 22.68 15.50
    03:09:08 23.02 15.50
    02:53:17 22.85 15.70
    02:48:30 22.85 15.70
    02:34:15 22.97 14.30
    02:23:09 22.90 15.50
    02:18:23 23.21 15.70
    02:04:08 22.75 15.50


    Et ainsi de suite...Je dois faire un nouveau fichier texte présenté de cette façon:
    time ch0 ch1
    00:15:00
    00:30:00
    00:45:00
    01:00:00
    01:15:00
    ...
    23:45:00

    Pour chaque valeur de time, faire une moyenne de toutes les valeurs de ch0 contenu dans l intervalle (entre 00:00:00 et 00:15:00 pour la premiere ligne) et l'afficher...De meme pour ch1

    Jy arrive vraiment pas...Est ce que quelqu un aurait une idée ? Merci beaucoup d'avance

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    cette discussion devrait t'aider
    tu ne montres pas le code que tu as déjà produit, il ne s'agit donc pas de "t'aider" mais de "faire à ta place", si faire 2 boucles imbriquées te pose souci il te faut probablement revoir les bases du langage avec un tutoriel (ou louer les services d'un programmeur, ça va plus vite mais ça coûte plus cher)

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par joker_92 Voir le message
    Jy arrive vraiment pas...Est ce que quelqu un aurait une idée ? Merci beaucoup d'avance
    Il faut commencer par filtrer les chX qui sont dans l'intervalle de temps dt1, dt2.
    Et vous avez la chance de pouvoir utiliser l'ordre lexicographique pour tester les temps d'acquisition dans cet intervalle via dt1 <= date < dt2 où dt1, date, dt2 sont des chaînes de caractères.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Il faut commencer par filtrer les chX qui sont dans l'intervalle de temps dt1, dt2.
    Et vous avez la chance de pouvoir utiliser l'ordre lexicographique pour tester les temps d'acquisition dans cet intervalle via dt1 <= date < dt2 où dt1, date, dt2 sont des chaînes de caractères.

    - W
    Mon idée était d utiliser les expressions régulières pour lire chaque ligne, et à partir de là, pouvoir filtrer les valeurs...

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import re
    import numpy as np
    fichier = open("sensor_bis.txt", "r") #nom du fichier input
    lignes  = fichier.readlines()
    for ligne in lignes:
        m1 = re.search(r'(\d+)/(\d+)/(\d+)\t(\d+):(\d+):(\d+)\t([0-9]+).([0-9]+)\t([0-9]+).([0-9]+)\t',ligne)
        if m1 is not None:
            print('salut')# test pour vérifier qu il peut bien lire la ligne
    Mais j ai surement une erreur mais je n'arrive pas à la trouver....Merci

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par joker_92 Voir le message
    Mais j ai surement une erreur mais je n'arrive pas à la trouver....Merci
    Vos lignes semblent toutes faire la même longueur et si le séparateur est '\t', line.split('\t') devrait suffire.
    Par ailleurs le séparateur étant \t, c'est une variante de fichier CSV qui pourrait être lue avec le module csv.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    Tout dépend de la finalité du projet, mais personnellement je choisirais d'utiliser la bibliothèque pandas pour cela. Il y a d'excellentes méthodes pour manipuler des données (regroupement, fonctions sur lignes/colonnes, resamping).

    Une dépendance supplémentaire n'est pas forcément intéressante, mais bon. Une fois le fichier lu avec df = pd.read_table('my_file.txt', sep='\t') et traité de sorte à avoir l'index au format date, il suffit d'appeler la méthode qui va bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df.resample('15min').mean()
    En tout ça devrait pas prendre plus de 4 ou 5 lignes.

    J

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Salut,

    Tout dépend de la finalité du projet, mais personnellement je choisirais d'utiliser la bibliothèque pandas pour cela. Il y a d'excellentes méthodes pour manipuler des données (regroupement, fonctions sur lignes/colonnes, resamping).

    Une dépendance supplémentaire n'est pas forcément intéressante, mais bon. Une fois le fichier lu avec df = pd.read_table('my_file.txt', sep='\t') et traité de sorte à avoir l'index au format date, il suffit d'appeler la méthode qui va bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df.resample('15min').mean()
    En tout ça devrait pas prendre plus de 4 ou 5 lignes.

    J
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import pandas as pd
    df = pd.read_table('sensor_bis.txt', sep='\t')
    df1 = df[['Time of acquisition']]
    print (df1)
    Time of acquisition
    0 03:53:32
    1 03:44:01
    2 03:39:16
    3 03:34:30
    4 03:23:24
    5 03:18:38
    6 03:13:53
    7 03:09:08
    8 02:53:17
    9 02:48:30
    ...

    Mais je ne peux pas le convertir en liste (df1) pour pouvoir le mettre dans une boucle pour tester si chaque temps est dans un intervalle de cette liste et en prendre les valeurs associées.... :

    ['00:15:00', '00:30:00', '00:45:00', '01:00:00', '01:15:00', '01:30:00', '01:45:00', '02:00:00', '02:15:00', '02:30:00', '02:45:00', '03:00:00', '03:15:00', '03:30:00', '03:45:00', '04:00:00', '04:15:00', '04:30:00', '04:45:00', '05:00:00', '05:15:00', '05:30:00', '05:45:00', '06:00:00', '06:15:00', '06:30:00', '06:45:00', '07:00:00', '07:15:00', '07:30:00', '07:45:00', '08:00:00', '08:15:00', '08:30:00'....]

    Mon idée est de faire la chose suivante :

    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
    fichier = open("sensor_bis.txt", "r")
    lignes  = fichier.readlines()
    dt_ref = datetime.datetime.combine(datetime.date(year=1, month=1, day=1), datetime.time(hour=0, minute=0, second=0))
    d1=[]
    d2=[]
    for i in range(95):#vecteur de réference
        dt_ref += datetime.timedelta(minutes=15)
        m=dt_ref.time().strftime("%H:%M:%S")
        d1.append(m)
     
    for ligne in lignes:#pour chaque ligne, matcher et prendre le temps d aquisition 
        m1 = re.search(r'(\d+)/(\d+)/(\d+)\t(\d+):(\d+):(\d+)\t?[0-9]*\.?[0-9]+\t?[0-9]*\.?[0-9]+\t',ligne)
        if m1 is not None:
            date=m1.group(4)+":"+m1.group(5)+":"+m1.group(6)
            date_=datetime.datetime.combine(datetime.date(year=1, month=1, day=1), datetime.time(hour=int(m1.group(4)), minute=int(m1.group(5)), second=int(m1.group(6))))
            date__=date_.time().strftime("%H:%M:%S")
            for j in range(len(d1)):
                if (d1[j]<date__)&(d1[j+1]>date__):#chercher l intervalle dans lequel se trouve le temps, et en prendre la valeur
                    print(m1.group(7))
    mais cela ne marche pas

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2017
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Julien N Voir le message
    Salut,

    Tout dépend de la finalité du projet, mais personnellement je choisirais d'utiliser la bibliothèque pandas pour cela. Il y a d'excellentes méthodes pour manipuler des données (regroupement, fonctions sur lignes/colonnes, resamping).

    Une dépendance supplémentaire n'est pas forcément intéressante, mais bon. Une fois le fichier lu avec df = pd.read_table('my_file.txt', sep='\t') et traité de sorte à avoir l'index au format date, il suffit d'appeler la méthode qui va bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df.resample('15min').mean()
    En tout ça devrait pas prendre plus de 4 ou 5 lignes.

    J
    En utilisant pandas j ai reussi...
    mais le fichier que j obtiens est le suivant :

    Time of acquisition ch1
    ['00:15:00', '00:30:00', '00:45:00', '01:00:00', '01:15:00', '01:30:00', '01:45:00', '02:00:00', '02:15:00', '02:30:00', '02:45:00', '03:00:00', '03:15:00', '03:30:00', '03:45:00', '04:00:00', '04:15:00', '04:30:00', '04:45:00', '05:00:00', '05:15:00', '05:30:00', '05:45:00', '06:00:00', '06:15:00', '06:30:00', '06:45:00', '07:00:00', '07:15:00', '07:30:00', '07:45:00', '08:00:00', '08:15:00', '08:30:00', '08:45:00', '09:00:00', '09:15:00', '09:30:00', '09:45:00', '10:00:00', '10:15:00', '10:30:00', '10:45:00', '11:00:00', '11:15:00', '11:30:00', '11:45:00', '12:00:00', '12:15:00', '12:30:00', '12:45:00', '13:00:00', '13:15:00', '13:30:00', '13:45:00', '14:00:00', '14:15:00', '14:30:00', '14:45:00', '15:00:00', '15:15:00', '15:30:00', '15:45:00', '16:00:00', '16:15:00', '16:30:00', '16:45:00', '17:00:00', '17:15:00', '17:30:00', '17:45:00', '18:00:00', '18:15:00', '18:30:00', '18:45:00', '19:00:00', '19:15:00', '19:30:00', '19:45:00', '20:00:00', '20:15:00', '20:30:00', '20:45:00', '21:00:00', '21:15:00', '21:30:00', '21:45:00', '22:00:00', '22:15:00', '22:30:00', '22:45:00', '23:00:00', '23:15:00', '23:30:00', '23:45:00', '00:00:00'] [23.05666666666667, 23.24, 22.994999999999997, 22.99, 22.86, 22.97, 22.835, 22.82, 22.75, 23.055, 22.97, 22.85, 22.85, 22.740000000000002, 22.88, 22.775, 22.945, 22.92, 22.79, 22.86, 22.89, 23.04, 22.97666666666667, 23.09, 22.965, nan, 23.21, nan, 22.97, 22.906666666666666, 22.97, nan, 22.85, 22.87, 22.8, 22.97, 22.87, nan, 22.816666666666666, 22.645, 22.849999999999998, 22.78333333333333, nan, 22.833333333333332, 22.86, 22.85, 22.875, 22.9, 22.965, nan, 22.82, 22.82, 22.96, 22.88, 23.02, 22.92, 22.895, nan, 23.03, 22.97, 23.005000000000003, 23.19, 22.746666666666666, 22.98, 22.84, 22.895, 22.85, 22.740000000000002, 22.94333333333334, 22.91, nan, 22.82, 22.96, 22.87, 23.175, 22.9, 22.9, 22.94333333333333, 22.87, nan, 22.945, 22.91, 22.765, 23.14, 23.015, 22.945, 22.8, 22.955, 22.895, 22.875, 22.866666666666664, 23.006666666666664, 23.21, 23.26, 22.896666666666665, nan]

    Comment peux je le restructurer en colonnes ? Merci

  9. #9
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    Je chargerais les données comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    df = pd.read_csv(
        'sensor_bis.txt', sep='\t', names=('Time', 'X', 'Y'), skiprows=1,
        index_col=0, parse_dates=True,
        )
    J'ai pris la liberté de renommer les colonnes directement à la lecture (Time, X, Y), à adapter. Je ne lis pas la première ligne, indique que la première colonne doit être l'index du dataframe et je laisse la liberté à pandas de déterminer si les données sont des dates.

    Pour faire le sampling:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    df = df.resample('15min').mean()
    print(df)
     
                              X          Y
    Time
    2017-05-24 02:00:00  22.750  15.500000
    2017-05-24 02:15:00  23.055  15.600000
    2017-05-24 02:30:00  22.970  14.300000
    2017-05-24 02:45:00  22.850  15.700000
    2017-05-24 03:00:00  22.850  15.500000
    2017-05-24 03:15:00  22.740  14.850000
    2017-05-24 03:30:00  22.880  15.633333
    2017-05-24 03:45:00  22.820  15.700000
    Y'a moyen de mannipuler les dates pour éviter d'afficher la date par défaut (celle d'aujourd'hui).

    J

Discussions similaires

  1. Ne retourner que la "meilleure" valeur pour chaque jour
    Par Drakkhen dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/03/2009, 17h03
  2. [MySQL] Recuperer les resultas d'une requête MySQL et acceder a les valeur pour chaque champ
    Par bourbita.thameur dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 03/03/2009, 16h48
  3. Réponses: 1
    Dernier message: 03/07/2007, 16h04
  4. Réponses: 1
    Dernier message: 26/06/2007, 12h26

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