我正在尝试浏览我拥有的数据,但是我发现数据中存在很多异常情况。数据框的日期列的日期为“ 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']
答案 0 :(得分:5)
您可以使用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']
答案 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 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年代的日期: