为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas Dataframe:df.apply 忽略错误行

Pandas Dataframe:df.apply 忽略错误行

红糖糍粑 2024-01-16 10:43:59
早上好!我正在尝试将具有各种格式的多个日期的列转换为日期时间列。import pandas as pddata = {'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)如果无法将其转换为日期时间,是否可以跳过 apply 函数中的一行?或者将错误行转换为默认日期(即“1900-01-01”)?
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

errors='coerce'如果在to_datetimeget中使用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

NaT然后按列删除带 s 的行c2:


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

或者您可以将它们替换为某个日期时间(不是 string '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


查看完整回答
反对 回复 2024-01-16
?
精慕HU

TA贡献1845条经验 获得超8个赞

通过errors,coerce无法转换的将返回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


查看完整回答
反对 回复 2024-01-16
?
撒科打诨

TA贡献1934条经验 获得超2个赞

您可能需要事先使用 转换 ERRER replace。这意味着具有缺失值 NaT 的其他行将保持为 NaT。

df['c1'] = df['c1'].replace('ERRER', '01/01/1900')

之后它应该可以工作:

df['c2'] = df.apply(lambda x: pd.to_datetime(x['c1']), axis=1)


查看完整回答
反对 回复 2024-01-16
  • 3 回答
  • 0 关注
  • 43 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信