2

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

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”)?

4

3 回答 3

1

传递errorscoerce因为无法转换的将返回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
于 2020-10-27T13:12:24.507 回答
1

如果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

然后按列删除带有NaTs 的行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'):

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
于 2020-10-27T13:12:26.303 回答
0

您可能需要事先使用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)
于 2020-10-27T13:24:15.607 回答