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 :

Problème pour réaliser des moyennes sous datetime


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    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
    Par défaut Problème pour réaliser des moyennes sous datetime
    Bonjour à tous,

    j'ai réalisé un code qui me permet de présenter des données sous la forme suivante :

    Acquisition date Time of acquisition ch0_1 ch1_1
    29/05/2017 23:55:43 26.92 19.40
    29/05/2017 23:50:57 26.67 18.70
    29/05/2017 23:46:12 26.75 19.20
    29/05/2017 23:36:41 27.03 19.10
    29/05/2017 23:31:54 26.75 18.60
    29/05/2017 23:27:09 26.78 19.10
    29/05/2017 23:20:49 26.84 18.90
    29/05/2017 23:16:04 26.56 19.20
    29/05/2017 23:11:18 26.70 19.10
    29/05/2017 23:01:48 26.73 19.10
    29/05/2017 22:57:03 26.70 18.90

    J ai ensuite réalisé un code qui permet de calculer les moyennes des ces valeurs ( ch0_1, ch1_1) toutes les 15 min et le présenter sous la forme suivante :

    Acquisition date Time of acquisition ch0_1 ch1_1
    29/05/2017 22:45:00 26.85 19.10
    29/05/2017 23:00:00 26.79 18.97
    29/05/2017 23:15:00 26.83 19.07
    29/05/2017 23:30:00 26.71 19.10
    29/05/2017 23:45:00 26.73 19.07
    30/05/2017 00:00:00 9999 9999

    la moyenne des valeurs comprises entre 22:45:00 et 23:00:00 est 26.79(ch0_1) et 18.97(ch1_1). '9999' signifie qu'aucune valeur est trouvé dans l'intervalle donné

    Le problème est que les valeurs comprises entre 23:45:00 et 23:59:00 du 29/05/2017 ne sont pas tenus en compte par le code : on voit apparaître '9999'( elles existent évidemment !! ). Si quelqu un aurait une idée, cela m aiderait énormément !! Merci

    Voici le code réalisée :

    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
    #read text file
    data = pd.read_table('sensor_bis.txt', sep='\t')
    #DataFrame
    df = pd.DataFrame(data)
    #Extraction of columns
    df0=df['Acquisition date']
    df1=df['Time of acquisition']
    df2=df['ch0_1']
    df3=df['ch1_1']
    #definition of variables
    ch0_1=[]
    ch1_1=[]
    date=[]
    time=[]
    #Initialization datetime.date object
    ini=0
    fin=int(len(df0)-1)#integer of initial data
    date_i=df0[fin]
    date_i=date_i.replace("/",' ')
    date_i=date_i.split()
    year_i=int(date_i[2])
    month_i=int(date_i[1])
    day_i=int(date_i[0])
    time_i=df1[fin]
    time_i=time_i.replace(":",' ')
    time_i=time_i.split()
    hour_i=int(time_i[0])
    #min_i=int(time_i[1])
    #sec_i=int(time_i[2])
    #datetime object : "year_ / month_ / day_  00:00:00"
    dt_i = datetime.datetime.combine(datetime.date(year=year_i, month=month_i, day=day_i), datetime.time(hour=hour_i, minute=0, second=0))
    #list date and time
    for i in range(fin):
        dt_i += datetime.timedelta(minutes=x)
        d=dt_i.date().strftime("%d/%m/%Y")
        t=dt_i.time().strftime("%H:%M:%S")
        date.append(d)
        time.append(t)
    time.insert(0,"00:00:00")
    #list parameters
    for j in range(fin):
        var0=0
        var1=0
        filter_ =((df1 >= time[j-1]) & (df1 <= time[j]) & (df0 == date[j-1]) & (df2!=9999))
        var0='%.2f'%float(df2[filter_].mean())
        var0=var0.replace("nan",'9999')
        filter_ =((df1 <= time[j]) & (df1 >= time[j-1]) & (df0 == date[j]) & (df3!=9999))
        var1='%.2f'%float(df3[filter_].mean())
        var1=var1.replace("nan",'9999')
        ch0_1.append(var0)
        ch1_1.append(var1)

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    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 : 662
    Par défaut
    Salut,

    Le code m'a l'air d'être excessivement compliqué pour faire si peu. Pourquoi ces extractions de colonnes, et ce "parsing" des dates? Utiliser Pandas est une très bonne idée. Je suis sûr que l'on peut charger les données et combiner plusieurs colonnes pour en faire une date en très peu de lignes.

    Pour ce qui est de faire la moyenne sur une plage de temps (15min), je me pencherais du côté de resample de Pandas. Quelque chose dans ce goût là (en supposant que df soit la première dataframe que vous montrer):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df = df.resample('15T').mean()
    Ju

Discussions similaires

  1. Problème pour exporter des données sous Excel
    Par antoine2933 dans le forum ODS et reporting
    Réponses: 10
    Dernier message: 28/06/2011, 11h16
  2. [XL-2007] Code VBA pour supprimer des lignes sous condition - problème
    Par PeaceMaker dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/06/2011, 09h09
  3. Problème pour créer des sous-figures avec subfig
    Par cmilie dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 17/07/2009, 10h22
  4. Réponses: 17
    Dernier message: 07/09/2007, 08h06

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