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

Calcul scientifique Python Discussion :

Calcul du dataframe et datetime


Sujet :

Calcul scientifique Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Calcul du dataframe et datetime
    Bonjour,

    J'ai un fichier csv de données que j'ouvre parfaitement sous Python dans une dataframe. Ce fichier est horodaté avec mon format qui va bien. j'ai normalement une ligne par demi-heure.
    Maintenant que j'ai ma df, je souhaiterais nettoyer le fichier qui porte plusieurs erreurs. Il peut y avoir des doublons de lignes, le fichier peut être inférieur ou supérieur à une année de données, ou il peut manquer une ou plusieurs lignes.

    - Pour enlever les lignes qui sont en doublon, j'ai simplement utilisé
    et ça marche très bien

    - En revanche pour les deux autres erreurs que je souhaiterais corriger, je sèche.
    - Comment par exemple ajouter des lignes manquantes avec des NaN à un fichier qui s'arrête le 20/12/2020 12:00 alors qu'il devrait aller =jusqu'à 31/12/2020 23:30
    - pour l'erreur lié à des lignes manquantes au sein du fichier, je pourrais détecter une différence d'une ligne n à n-1 et si elle est >0.02 (différence je crois entre deux demi-heures consécutives) alors c'est que j'ai un écart de plus d'une demi-heure d'une ligne à l'autre. Dans ce cas, il faudrait que je trouve un moyen de pouvoir combler ces lignes lignes manquantes avec les bonnes dates et heures en colonne 1 et des NaN dans le reste des variables.


    Merci pour votre aide.

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2013
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juillet 2013
    Messages : 80
    Points : 119
    Points
    119
    Par défaut
    Bonjour,

    En supposant que la dataframe ait un index contenant des datetime :

    Pour la première difficulté, j'utiliserai une boucle while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import datetime as dt
    import pandas as pd
     
    >>> Initialize df <<<
     
    end_time = dt.datetime(2020,12,31,23,30) # Requested last time
     
    while df.index[-1]!=end_time : # If last row is already valid, loop won't start
        next_time = df.index[-1]+dt.timedelta(seconds=30*60) # Add 30 minutes
        df.loc[next_time]=pd.Series() # Add row to dataframe
    Pour la deuxième difficulté, je ne connais pas de méthode "insert" pour inclure une ligne à un endroit précis donc je ferai naïvement :
    1) Créer une liste de toutes les datetimes souhaitées (mieux serait un générateur mais laissez tomber si vous ne savez pas comment faire)
    2) Parcourir la liste et checker si l'élément (par exemple requested_date) existe dans l'index de la dataframe
    3) Si non, ajouter un pd.Series(name=requested_date) avec la méthode pd.DataFrame.append()
    4) Enfin, trier le dataframe selon l'index avec la méthode pd.DataFrame.sort_index()

    REMARQUE : du coup, la première boucle ne sert à rien, passez directement à l'implémentation de la deuxième question puisque les dates manquantes à la fin sont inclues dans la liste de toutes les dates demandées

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    Merci pour le retour, je vais tenter dans cette optique. Je débute en Python, je m'aide beaucoup et beaucoup de Google pour trouver les fonctions. J'imagine que tout le monde fait ça ?

    J'ai effectivement déjà créé une dataframe cible avec toutes les dates et toutes les demi-heures que je souhaiterais avoir au final dans le fichier source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #creation d'une colonne avec toutes les dates de l'année 2020 avec frequence semi-horaire
    test=pd.bdate_range(t_start,t_end,freq='30T')
    test=test.to_frame()
    test.columns=['TimeRef']
    Mais ne faut-il pas changer l'index de cette table pour que je puisse comparer avec le fichier à travailler ? Actuellement, l'index c'est la date et ce n'est pas un nombre de 0 à n... J'ai tenté de le changer hier mai sans succès, en utilisant df.reset_index() et aussi df_reindex().

    Cordialement,

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Mais en fait, c'est tout bête. J'ai réassigné l'index de mon fichier source avec ses dates et comme j'ai un fichier de référence (avec les 17569 lignes) qui est indexé sur les dates, j'ai juste fait un concat et ça marche parfaitement. En code, ça donne :

    On va dire que ma df source s'appelle source et elle a cette forme :

    id Date Var1 Var2 Var3
    1 2020-01-01 00:00 ... ... ...
    2 2020-01-01 00:30 ... ... ...
    3 2020-01-01 01:00 ... ... ...
    ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #creation d'une df avec toutes les dates de l'année 2020 avec frequence semi-horaire
    t_start = pd.to_datetime('01/01/2020 00:30',format='%d/%m/%Y %H:%M')
    t_end = pd.to_datetime('01/01/2021 00:00',format='%d/%m/%Y %H:%M')
    dateref=pd.bdate_range(t_start,t_end,freq='30T')
    dateref=dateref.to_frame()
    dateref.columns=['TimeRef']
     
    #assignation de la colonne Date comme index
    source.set_index('Date',inplace = True)
     
    #concatenation des deux df
    result = pd.concat([source, dateref], axis=1)
    result.to_csv('result.csv')
    Le résultat est un fichier csv avec en première colonne toutes les dates indiquées comme index dans dateref et toutes les autres colonnes des variables de la df source. J'ai en revanche des trous là ou il n'y a pas de données mais il doit exister une fonction fill les trous avec des NaN ou tout ce qu'on veut.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calculer une différence de datetime
    Par maintenance_info dans le forum Développement
    Réponses: 2
    Dernier message: 01/04/2021, 15h55
  2. Calculer la somme des heures à partir d'un champ datetime
    Par bilel.amri dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 10/09/2008, 14h28
  3. DateTime calcul de durée ?
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 01/04/2008, 13h40
  4. DateTime et calcul Heures:Minutes
    Par digitaldna dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/03/2008, 16h25
  5. [Noobie]Calcul entre deux champs datetime
    Par bigltnt dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/07/2007, 10h37

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