Я пытаюсь исследовать данные, которые у меня есть, но я нашел много анамолий в моих данных. Столбец даты в кадре данных имеет дату, например "12012-09-14" и "2500-09-28". Я хотел бы заменить их на «2250-05-05».

Я хотел бы сохранить действительные даты в df1 и эти недействительные даты в списке

Df1 :

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 

Может ли кто-нибудь помочь мне, как извлечь эти недействительные даты?

Ожидаемый выход:

    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

Уникальный список недействительных дат:

invalid_list = ['12012-09-14','12017-09-14','12113-09-14','12012-09-24','2500-09-28']
1
Vamsi Nimmala 27 Июн 2019 в 22:02

2 ответа

Мы можем написать шаблон regex для этого, чтобы перехватить ошибочные даты, а затем извлечь их с помощью boolean indexing и tolist:

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

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

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

Примечание : это не очень хорошо подходит для дат 1900-х годов:

2
Erfan 27 Июн 2019 в 21:25

Решение, предоставленное @yatu, отвечает на первую часть вашего вопроса.

Чтобы получить список плохих дат по второй части:

>>> 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']
3
Alexander 27 Июн 2019 в 19:22