如何从pandas中的日期列中查找不匹配值

时间:2017-02-06 13:27:00

标签: python parsing pandas datetime

数据框包含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)

任何更快执行的替代方式。

1 个答案:

答案 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

如果省略formatto_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