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 :

Enlever les caractères pandas dataframe


Sujet :

Python

  1. #21
    Membre actif
    Inscrit en
    Août 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 41
    Par défaut
    salam,
    merci pour ton aide mais lorsque une ligne contient une date comme:1986-03-12 00:00:00
    il me donne NaN .comment extraire les dates et spliter les lettres des dates en meme temps.
    voila la liste:
    Nom : liste.png
Affichages : 133
Taille : 8,5 Ko
    voila le resultat:
    Nom : res.png
Affichages : 102
Taille : 5,1 Ko

    Merci d'avance.

    Citation Envoyé par fred1599 Voir le message
    Fallait s'y attendre, il est rare, même dans le monde professionnel où une demande n'est pas élargie, modifiée voir même supprimée... Le PO ne déroge pas à la règle ! Cependant, sur une demande où les cas de figures sont peu nombreux comme l'est le formatage de date, il aurait été logique d'avoir tout ces cas dès le premier post.

    C'est d'ailleurs pour cela que j'avais présenté dès ma 1ère réponse une solution prenant tous les cas, à force sur les forums tu t'habitues à prévoir ce genre de changement, en plus avec le module dateutil, ça s'y prettait plutôt bien


    @didoalilo
    Il est possible de le faire avec pandas, mais la solution avec expression régulière me semble bien plus complexe que ma solution de départ, je suis pas certains que se soit la meilleure solution

    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
    import pandas as pd
    data = (
        "12/03/86",
        "11/01/1978 برج الغدير",
        "19/12/1978 عنابة",
        "20/04/1971 عنابة",
        "12/06/1962 عنابة",
        "07/01/1978 قسنطينة",
        "12/06/1965 واد زناتي",
        "31/08/1989 سوق أهراس",
        "01/04/1988 عنابة",
        "02/07/1974 لخضارة",
        "04/01/1977 عنابة",
        "10/08/1987 toto",
        "15-05-89",
        "23-10-1995 عنابة",
    )
     
    df = pd.DataFrame(data, columns=['input'])
     
    df['date'] = df['input'].str.extract(r'(\d{1,2}(?:\/|-)\d{1,2}(?:\/|-)(?:\d{2}|\d{4}))')
    df['date'] = pd.to_datetime(df['date'], dayfirst=True, errors='coerce').dt.strftime('%d/%m/%Y')
     
    print(df['date'])
    Imaginions que l'on prenne la version anglaise de date, on aurait encore à modifier l'expression régulière.

    ------------------------------

    Proposition qui je pense va mettre d'accord les deux mondes, utiliser la fonction extract_dates dans ta dataframe en utilisant apply.

    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
    import pandas as pd
    from dateutil.parser import parse
     
    def extract_date(x):
        try:
            date_string = parse(x, fuzzy=True)
        except ValueError:
            return None
        return date_string.strftime('%d/%m/%Y')
     
    data = (
        "12/03/86",
        "11/01/1978 برج الغدير",
        "19-12-1978 عنابة",
        "20/04/1971 عنابة",
        "12/06/1962 عنابة",
        "07/01/1978 قسنطينة",
        "12/06/1965 واد زناتي",
        "31/08/1989 سوق أهراس",
        "01/04/1988 عنابة",
        "02/07/1974 لخضارة",
        "04/01/1977 عنابة",
        "10/08/1987 toto",
        "96-10-25 test_anglais",
        "2008-11-28 autres tests anglais"
    )
     
    df = pd.DataFrame(data, columns=['input'])
    df['date'] = df['input'].apply(extract_date)
     
    print(df)

  2. #22
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par didoalilo Voir le message
    merci pour ton aide mais lorsque une ligne contient une date comme:1986-03-12 00:00:00 il me donne NaN .
    Là tu parles de la ligne 0. Tu as remarqué que pour la ligne 1 (11/01/1978) ça te sort 11/01/2019? et pour la ligne 2 (19/12/1978) ça te sort 19/12/2019? Il est vraiment tout pourri ton fichier. D'ailleurs ce décalage d'affichage entre la ligne 1 alignée à gauche et la ligne 2 alignée à droite en est un indice supplémentaire.

    Citation Envoyé par didoalilo Voir le message
    comment extraire les dates et spliter les lettres des dates en meme temps.
    Hier j'ai parlé de remettre ton fichier au carat. C'était quand-même une question, question à laquelle tu n'as pas répondu. wiztricks redit à peu près la même chose quand il écrit "Si c'est du texte dans lequel on mélange tout: pas la peine d'utiliser Excel!". On ne peut traiter une info que si l'info est bien calibrée. Le "ça dépend" ça ne peut pas se coder. Si ta colonne contient une date plus du texte alors ce n'est pas une date, c'est du texte. Je t'ai montré comment séparer le texte de la date (en partant du principe qu'il y avait un espace de séparation, ce qui aujourd'hui semble moins certain).
    Mais bon en admettant, donc une fois que tu as la date (enfin c'est toujours du texte mais "représentant" une date), tu peux le récupérer en vrai format "date" via les outils montrés par fred1599.

    Citation Envoyé par fred1599 Voir le message
    il est rare, même dans le monde professionnel où une demande n'est pas élargie, modifiée voir même supprimée...
    Je pense qu'ici on dépasse imperceptiblement (mais avec régularité) ce niveau de "monde professionnel" pour entrer dans le niveau du "ça dépend" qui est généralement celui des chefs...

    Citation Envoyé par fred1599 Voir le message
    Cependant, sur une demande où les cas de figures sont peu nombreux comme l'est le formatage de date
    Tu ne sens pas comme une impression que les cas de figure sont en train de se multiplier comme les petits pains?
    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]

  3. #23
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tu ne sens pas comme une impression que les cas de figure sont en train de se multiplier comme les petits pains?
    Si, et maintenant que les bases sont présentes, étant donné l'objectif du forum, il va pouvoir comprendre les propositions de code et modifier selon ses besoins...

    @didoalilo,

    Un conseil, écrire un petit fichier de tests afin de vérifier que ce qui fonctionnait avant fonctionne toujours après modifications.

Discussions similaires

  1. Réponses: 13
    Dernier message: 22/10/2012, 12h08
  2. Enlever les caractères de bourrages
    Par boux2 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/07/2006, 12h07
  3. [C#][ADO] Enlever les caractère spéciaux
    Par Oberown dans le forum Windows Forms
    Réponses: 3
    Dernier message: 10/01/2005, 18h38

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