1
votes

Extraire les anomalies de la colonne dataframe

J'essaie d'explorer les données dont je dispose, mais j'ai trouvé beaucoup d'anamolies dans mes données. La colonne de date de la trame de données a une date comme "12012-09-14" et "2500-09-28". Je souhaite les remplacer par "2250-05-05".

Je souhaite conserver les dates valides dans df1 et ces dates non valides dans une liste

df1:

invalid_list = ['12012-09-14','12017-09-14','12113-09-14','12012-09-24','2500-09-28']

Quelqu'un pourrait-il m'aider à extraire ces dates invalides?

Résultat attendu:

    col col2    date
0    1  b1a2 2250-05-05
1    2  bal2 2250-05-05
2    3  a3l2 2250-05-05
3    4  a5l2 2019-09-24
4    5  a8l2 2012-09-28
5    6  a1l2 2250-05-05
6    7  a0l2 2250-05-05
7    8  a2l2 2250-05-05
8    9  a6l2 2250-05-05
9   10  a5l2 2012-09-24

liste unique de dates invalides:

col col2        date 
1   b1a2         NaN 
2   bal2  12012-09-14 
3   a3l2  12017-09-14 
4   a5l2  2019-09-24 
5   a8l2  2012-09-28 
6   a1l2  12113-09-14 
7   a0l2  12012-09-24 
8   a2l2  2500-09-28 
9   a6l2  2500-09-14 
10  a5l2  2012-09-24 

p >


0 commentaires

3 Réponses :


5
votes

Vous pouvez utiliser pd.to_datetime et fillna à remplir avec la date spécifiée:

to_dt = pd.to_datetime(df.date, errors='coerce')
invalid_list = df.loc[to_dt[to_dt.isna()].index, 'date'].dropna().values.tolist()
df['date'] = to_dt.fillna(new_date)

print(invalid_list)
['12012-09-14',
 '12017-09-14',
 '12113-09-14',
 '12012-09-24',
 '2500-09-28',
 '2500-09-14']

Mise à jour

Afin de obtenir les dates invalides dans une liste:

new_date = pd.to_datetime("2250-05-05")
df['date'] = pd.to_datetime(df.date, errors='coerce').fillna(new_date)

    col col2    date
0    1  b1a2 2250-05-05
1    2  bal2 2250-05-05
2    3  a3l2 2250-05-05
3    4  a5l2 2019-09-24
4    5  a8l2 2012-09-28
5    6  a1l2 2250-05-05
6    7  a0l2 2250-05-05
7    8  a2l2 2250-05-05
8    9  a6l2 2250-05-05
9   10  a5l2 2012-09-24


1 commentaires

Voici à quoi devrait ressembler la sortie, mais je souhaite enregistrer ces dates invalides dans une liste. Je vais éditer ma question.



3
votes

La solution fournie par @yatu répond à la première partie de votre question.

Pour obtenir une liste des mauvaises dates par seconde partie:

>>> df.loc[pd.to_datetime(df['date'], errors='coerce').isnull(), 'date'].unique().tolist()
[nan,
 '12012-09-14',
 '12017-09-14',
 '12113-09-14',
 '12012-09-24',
 '2500-09-28',
 '2500-09-14']


0 commentaires

2
votes

Nous pouvons écrire un modèle regex pour cela pour attraper les dates erronées, puis les extraire avec indexation booléenne et tolist :

[nan,
 '12012-09-14',
 '12017-09-14',
 '12113-09-14',
 '12012-09-24',
 '2500-09-28',
 '2500-09-14']

m = ~df['date'].str.match('(20\d{2}\-\d+\-\d+)', na=False)

df.loc[m, 'date'].tolist()

Remarque : cela ne se généralise pas bien aux dates des années 1900:


2 commentaires

vous voudrez peut-être envisager des dates valides dans les années 1900.


Je suis d'accord, je voulais juste donner une solution différente de celle d'utiliser pd.to_datetime . Mais bon point, ajouté comme note . @QuangHoang