数据框包含1000万条记录。 所有列都是'str'数据类型。
让我们将其视为我的数据框架。
id location name Dob death
0 11066 location 481 2017-02-01 2017-02-03
1 18000 location 962 1990-01-27 2016-01-26
2 16964 location 491 1sssssssss 2016-01-26
3 4795 location 532 1990-01-29 2016-01-26
4 3392 location 600 1990-01/30 2016-01-26
我想找出'Dob'列的值不是日期类型的行/观察值。
预期结果:
id location name Dob death
2 16964 location 491 1sssssssss 2016-01-26
4 3392 location 600 1990-01/30 2016-01-26
我已经尝试过以下代码,但在执行速度方面却相当慢。
示例代码:
temp_list = list()
for index, data in enumerate(df['Dob']):
try:
pd.to_datetime(data)
except:
temp_list.append(index)
任何更快执行的替代方式。
答案 0 :(得分:1)
如果值与格式errors='coerce'
不匹配,则需要to_datetime
参数NaT
才能返回%Y-%m-%d
,然后按isnull
检查NaT
并持续使用boolean indexing
:
print (pd.to_datetime(df.Dob, errors='coerce', format='%Y-%m-%d'))
0 2017-02-01
1 1990-01-27
2 NaT
3 1990-01-29
4 NaT
Name: Dob, dtype: datetime64[ns]
mask = pd.to_datetime(df.Dob, errors='coerce', format='%Y-%m-%d').isnull()
print (mask)
0 False
1 False
2 True
3 False
4 True
Name: Dob, dtype: bool
print (df[mask])
id location name Dob death
2 16964 location 491 1sssssssss 2016-01-26
4 3392 location 600 1990-01/30 2016-01-26
如果省略format
,to_datetime
尝试转换,那么可能会将某些值转换为DateTime
而输出中为NO:
print (pd.to_datetime(df.Dob, errors='coerce'))
0 2017-02-01
1 1990-01-27
2 NaT
3 1990-01-29
4 1990-01-30
Name: Dob, dtype: datetime64[ns]
print (df[pd.to_datetime(df.Dob, errors='coerce').isnull()])
id location name Dob death
2 16964 location 491 1sssssssss 2016-01-26