熊猫数据框:df.apply忽略错误行

时间:2020-10-27 13:09:23

标签: python pandas apply string-to-datetime

早上好!我正在尝试将具有多种格式的多个日期的列转换为datetime列。

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)

如果无法将其转换为日期时间,是否可以跳过apply函数中的行?还是将错误行转换为默认日期(即“ 1900-01-01”)?

3 个答案:

答案 0 :(得分:1)

pytest_runtest_makereporterrors一起传递,因为无法转换的人将返回coerce

NaT

答案 1 :(得分:1)

如果在to_datetime中使用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 ,则获得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 列中有NaT的行:

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 ):

'1900-01-01'

答案 2 :(得分:0)

您可能需要预先使用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)