Python 从dataframe列中提取异常

Python 从dataframe列中提取异常,python,pandas,data-cleaning,Python,Pandas,Data Cleaning,我试图探索我所拥有的数据,但我在我的数据中发现了很多变形金刚。数据框的日期列的日期类似于“12012-09-14”和“2500-09-28”。我想将它们替换为“2250-05-05” 我希望在df1中保留有效日期,并将那些无效日期保留到列表中 df1: 有人能帮我提取那些无效日期吗 预期产出: col col2 date 0 1 b1a2 2250-05-05 1 2 bal2 2250-05-05 2 3 a3l2 2250-05-05 3 4 a

我试图探索我所拥有的数据,但我在我的数据中发现了很多变形金刚。数据框的日期列的日期类似于“12012-09-14”和“2500-09-28”。我想将它们替换为“2250-05-05”

我希望在df1中保留有效日期,并将那些无效日期保留到列表中

df1:

有人能帮我提取那些无效日期吗

预期产出:

    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']
您可以使用和填写指定的日期:

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']
您可以使用和填写指定的日期:

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

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

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

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

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

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


注意:这不能很好地概括1900年代的日期:

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

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

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


注意:这不能很好地概括1900年代的日期:

这是输出的外观,但我想将这些无效日期保存到列表中。我将编辑我的问题。这是输出的外观,但我想将这些无效日期保存到列表中。我会编辑我的问题。你可能想考虑1900个日期中的有效日期。我同意,只是想给出一个不同的解决方案,而不是使用<代码> Pd。toyDATEIME/<代码>。但这一点很公平,作为注释补充@Quangangangu可能想考虑有效日期在1900’。我同意,只是想给出一个不同的解决方案比使用<代码> Pd。toyDATEIMECT/<代码>。但这一点很公平,作为注释补充@广港