![](/img/trans.png)
[英]pandas error in df.apply() only for a specific dataframe
[英]Pandas Dataframe: df.apply ignore error rows
早上好! 我正在尝试将具有多种格式的多个日期的列转换为日期时间列。
import pandas as pd
data = {
'c1':['2020/10/01','10/01/2020','10/1/2020','31/08/2020','12-21-2020','5-3-2020','05-03-2020','ERRER']
}
df = pd.DataFrame (data, columns = ['c1'])
上面的代码创建了我要测试的数据框。 如果我运行以下代码,则会收到错误消息,因为“ERRER”不是有效日期:
df['c2'] = df.apply(lambda x: pd.to_datetime(x['c1']), axis=1)
如果无法转换为日期时间,有没有办法跳过应用函数中的一行? 或者将错误行转换为默认日期(即“1900-01-01”)?
使用coerce
传递errors
,因为不能转换的将返回NaT
df['c2'] = pd.to_datetime(df['c1'], errors='coerce')
df
Out[76]:
c1 c2
0 2020/10/01 2020-10-01
1 10/01/2020 2020-10-01
2 10/1/2020 2020-10-01
3 31/08/2020 2020-08-31
4 12-21-2020 2020-12-21
5 5-3-2020 2020-05-03
6 05-03-2020 2020-05-03
7 ERRER NaT
如果在to_datetime
使用errors='coerce'
获取NaT
(日期时间的缺失值),如果不是类似日期时间的值 - 您可以传递列以提高性能,而不apply
于循环:
df['c2'] = pd.to_datetime(df['c1'], errors='coerce')
print (df)
c1 c2
0 2020/10/01 2020-10-01
1 10/01/2020 2020-10-01
2 10/1/2020 2020-10-01
3 31/08/2020 2020-08-31
4 12-21-2020 2020-12-21
5 5-3-2020 2020-05-03
6 05-03-2020 2020-05-03
7 ERRER NaT
然后按列c2
删除带有NaT
的行:
df1 = df.dropna(subset=['c2'])
print (df1)
c1 c2
0 2020/10/01 2020-10-01
1 10/01/2020 2020-10-01
2 10/1/2020 2020-10-01
3 31/08/2020 2020-08-31
4 12-21-2020 2020-12-21
5 5-3-2020 2020-05-03
6 05-03-2020 2020-05-03
或者您可以将它们替换为某个日期时间(不是字符串'1900-01-01'
):
df['c2'] = pd.to_datetime(df['c1'], errors='coerce').fillna(pd.Timestamp('1900-01-01'))
print (df)
c1 c2
0 2020/10/01 2020-10-01
1 10/01/2020 2020-10-01
2 10/1/2020 2020-10-01
3 31/08/2020 2020-08-31
4 12-21-2020 2020-12-21
5 5-3-2020 2020-05-03
6 05-03-2020 2020-05-03
7 ERRER 1900-01-01
print (df.dtypes)
c1 object
c2 datetime64[ns]
dtype: object
您可能希望使用replace
预先转换 ERRER。 这意味着缺少值 NaT 的其他行将保持 NaT。
df['c1'] = df['c1'].replace('ERRER', '01/01/1900')
之后它应该工作:
df['c2'] = df.apply(lambda x: pd.to_datetime(x['c1']), axis=1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.