Python 从dataframe列中提取异常
我试图探索我所拥有的数据,但我在我的数据中发现了很多变形金刚。数据框的日期列的日期类似于“12012-09-14”和“2500-09-28”。我想将它们替换为“2250-05-05” 我希望在df1中保留有效日期,并将那些无效日期保留到列表中 df1: 有人能帮我提取那些无效日期吗 预期产出: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
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/<代码>。但这一点很公平,作为注释补充@广港