Извлечь аномалии из столбца данных - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь изучить имеющиеся у меня данные, но я обнаружил много анамолий в своих данных.Столбец даты в кадре данных имеет дату, например "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']

Ответы [ 3 ]

5 голосов
/ 27 июня 2019

Вы можете использовать pd.to_datetime и fillna, чтобы заполнить указанную дату:

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

Обновление

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

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']
3 голосов
/ 27 июня 2019

Решение, предоставленное @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']
2 голосов
/ 27 июня 2019

Мы можем написать шаблон 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-х годов:

...