Python 如何获取数据帧中具有无效np.datetime64日期的所有行

Python 如何获取数据帧中具有无效np.datetime64日期的所有行,python,datetime,numpy,pandas,Python,Datetime,Numpy,Pandas,我有一个pandas数据框,它有一个列,“date\u col”和日期字符串。我想筛选数据框中的所有行,如果由numpy.datetime64解析,则此列中的日期字符串将抛出ValueError。我正在寻找以下线索: bad_rows = df[numpy.datetime64(df["date_col"]) is False] 除了检查False,我想检查是否引发了ValueError。有没有办法在数据帧中进行这种类型的过滤 我试着做到以下几点: df = pd.DataFrame({"da

我有一个pandas数据框,它有一个列,“date\u col”和日期字符串。我想筛选数据框中的所有行,如果由
numpy.datetime64
解析,则此列中的日期字符串将抛出
ValueError
。我正在寻找以下线索:

bad_rows = df[numpy.datetime64(df["date_col"]) is False]
除了检查
False
,我想检查是否引发了
ValueError
。有没有办法在数据帧中进行这种类型的过滤

我试着做到以下几点:

df = pd.DataFrame({"date_col":("2015-04-31", "2015-04-30")})
result = pd.to_datetime(df["date_col"], errors='coerce')
但我得到:

>>> result
0    2015-04-31
1    2015-04-30
检查每个值的类型表明它们仍然是字符串

>>> result[0]
'2015-04-31'

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2 entries, 0 to 1
Data columns (total 1 columns):
date_col    2 non-null object
dtypes: object(1)
我得到:

Traceback (most recent call last):
  File "/Users/lib/python3.4/site-packages/pandas/tseries/tools.py", line 330, in _convert_listlike
    values, tz = tslib.datetime_to_datetime64(arg)
  File "pandas/tslib.pyx", line 1371, in pandas.tslib.datetime_to_datetime64 (pandas/tslib.c:23790)
TypeError: Unrecognized value type: <class 'str'>

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/lib/python3.4/site-packages/pandas/tseries/tools.py", line 340, in to_datetime
    values = _convert_listlike(arg.values, False, format)
  File "/Users/lib/python3.4/site-packages/pandas/tseries/tools.py", line 333, in _convert_listlike
    raise e
  File "/Users/lib/python3.4/site-packages/pandas/tseries/tools.py", line 307, in _convert_listlike
    arg, format, exact=exact, coerce=coerce
  File "pandas/tslib.pyx", line 2347, in pandas.tslib.array_strptime (pandas/tslib.c:39562)
ValueError: time data '2015-04-31' does not match format '%Y%m%d' (match)

只需执行
pd.to_datetime(df['date\u col'],errors='concurve')
这将在字符串无效的地方生成
NaT

例如:

In [307]:
df = pd.DataFrame({'date':['2015-02-01', 'sausage', '2011-01-33']})
df

Out[307]:
         date
0  2015-02-01
1     sausage
2  2011-01-33

In [308]:
pd.to_datetime(df['date'], errors='coerce')

Out[308]:
0   2015-02-01
1          NaT
2          NaT
Name: date, dtype: datetime64[ns]
随后调用
isnull()
将生成
True
,其中值无效:

In [309]:
pd.to_datetime(df['date'], errors='coerce').isnull()

Out[309]:
0    False
1     True
2     True
Name: date, dtype: bool
编辑

由于您使用的是
0.16.1
api有点不同,以下内容应该可以使用:

result= pd.to_datetime(df['date_col'], coerce=True)

这对我没用。当我尝试在一列字符串日期上使用
pd.to_datetime
时,我得到的是一列字符串日期,而不是一列datetime对象。您是否正在分配回?另外,在您的问题中编辑df.info()的更新代码和错误Post输出。您能尝试一下result=pd.to_datetime(df['date',format='%Y%m%d')您的pandas和numpy版本是什么吗?好的,您能尝试一下吗:
result=pd.to_datetime(df['date\u col',curve=True)
行得通,谢谢。
In [309]:
pd.to_datetime(df['date'], errors='coerce').isnull()

Out[309]:
0    False
1     True
2     True
Name: date, dtype: bool
result= pd.to_datetime(df['date_col'], coerce=True)