RegEx 是非常强大的工具,但在这种情况下有更好的方法:
In [180]: df
Out[180]:
ID ActualDate
0 738564 01/21/2016
1 274628 02/12/2016
2 571749 03/30/2016
3 718563 10/01/2016
4 984739 11/30/2016
5 938511 12/24/2016
6 103216 07/16/2014
7 446754 08/06/2015
8 135654 02/01/2017
9 135614 01/16/2017
10 133346 01/16/2011
11 234682 NaN
12 238756 (none)
让我们转换它datetime dtype:
In [181]: df['ActualDate'] = pd.to_datetime(df['ActualDate'], errors='coerce')
In [182]: df
Out[182]:
ID ActualDate
0 738564 2016-01-21
1 274628 2016-02-12
2 571749 2016-03-30
3 718563 2016-10-01
4 984739 2016-11-30
5 938511 2016-12-24
6 103216 2014-07-16
7 446754 2015-08-06
8 135654 2017-02-01
9 135614 2017-01-16
10 133346 2011-01-16
11 234682 NaT
12 238756 NaT
使用boolean indexing进行过滤:
In [184]: df[(df['ActualDate'] < '2016-11-01') | df['ActualDate'].isnull()]
Out[184]:
ID ActualDate
0 738564 2016-01-21
1 274628 2016-02-12
2 571749 2016-03-30
3 718563 2016-10-01
6 103216 2014-07-16
7 446754 2015-08-06
10 133346 2011-01-16
11 234682 NaT
12 238756 NaT
使用.query()方法过滤:
In [186]: df.query("ActualDate < '2016-11-01' or ActualDate != ActualDate")
Out[186]:
ID ActualDate
0 738564 2016-01-21
1 274628 2016-02-12
2 571749 2016-03-30
3 718563 2016-10-01
6 103216 2014-07-16
7 446754 2015-08-06
10 133346 2011-01-16
11 234682 NaT
12 238756 NaT
更新:如果您想在字符串 dtype 中保留原始 Date:
In [190]: df
Out[190]:
ID Actual Date
0 738564 01/21/2016
1 274628 02/12/2016
2 571749 03/30/2016
3 718563 10/01/2016
4 984739 11/30/2016
5 938511 12/24/2016
6 103216 07/16/2014
7 446754 08/06/2015
8 135654 02/01/2017
9 135614 01/16/2017
10 133346 01/16/2011
11 234682 NaN
12 238756 (none)
首先添加一个新的datetime 列:
In [191]: df['Date'] = pd.to_datetime(df['Actual Date'], errors='coerce')
In [192]: df
Out[192]:
ID Actual Date Date
0 738564 01/21/2016 2016-01-21
1 274628 02/12/2016 2016-02-12
2 571749 03/30/2016 2016-03-30
3 718563 10/01/2016 2016-10-01
4 984739 11/30/2016 2016-11-30
5 938511 12/24/2016 2016-12-24
6 103216 07/16/2014 2014-07-16
7 446754 08/06/2015 2015-08-06
8 135654 02/01/2017 2017-02-01
9 135614 01/16/2017 2017-01-16
10 133346 01/16/2011 2011-01-16
11 234682 NaN NaT
12 238756 (none) NaT
过滤:
In [194]: df.drop('Date', 1).loc[(df['Date'] < '2016-11-01') | df['Date'].isnull()]
Out[194]:
ID Actual Date
0 738564 01/21/2016
1 274628 02/12/2016
2 571749 03/30/2016
3 718563 10/01/2016
6 103216 07/16/2014
7 446754 08/06/2015
10 133346 01/16/2011
11 234682 NaN
12 238756 (none)
In [196]: df.query("Date < '2016-11-01' or Date != Date").drop('Date', 1)
Out[196]:
ID Actual Date
0 738564 01/21/2016
1 274628 02/12/2016
2 571749 03/30/2016
3 718563 10/01/2016
6 103216 07/16/2014
7 446754 08/06/2015
10 133346 01/16/2011
11 234682 NaN
12 238756 (none)