从数据框列中提取异常

时间:2019-06-27 19:02:02

标签: python pandas data-cleaning

我正在尝试浏览我拥有的数据,但是我发现数据中存在很多异常情况。数据框的日期列的日期为“ 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 个答案:

答案 0 :(得分:5)

您可以使用pd.to_datetimefillna填写指定的日期:

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']

答案 1 :(得分:3)

@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 :(得分:2)

我们可以为此编写一个regex模式以捕获错误日期,然后使用boolean indexingtolist提取它们:

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年代的日期: