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 >
3 Réponses :
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
Voici à quoi devrait ressembler la sortie, mais je souhaite enregistrer ces dates invalides dans une liste. Je vais éditer ma question.
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']
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:
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