2017-02-01 90 views
2

我正在使用熊貓和python在excel中做一些工作。我有這樣的事情。使用正則表達式在熊貓中過濾

ID   Actual Date 
738564  01/21/2016 
274628  02/12/2016 
571749  03/30/2016 
718563  10/01/2016 
984739  11/30/2016 
938511  12/24/2016 
103216  07/16/2014 
446754  08/06/2015 
135654  02/01/2017 
135614  01/16/2017 
133346  01/16/2011 
234682  N/A 
238756  (none) 

所以我需要按日期進行過濾,但我只需要2016年11月之前的一年日期過濾(所以我需要篩選2014年,2015年和月之間和2016年octuber)。所以基本上過濾器後,我都會有這樣的事情

 ID  Actual Date 
    738564 01/21/2016 
    274628 02/12/2016 
    571749 03/30/2016 
    718563 10/01/2016 
    103216 07/16/2014 
    446754 08/06/2015 
    133346 01/16/2011 
    234682  N/A 
    238756  (none) 

代碼i'm使用這就是:

regex = r"[0-9]{2}/[0-9]{2}/2016" 
df = pd.read_csv("Request.csv", keep_default_na=False) 
df1 = df.loc[(df["Actual Date"].str.contains(r'[0-9]{2}/[0-9]{2}/2016') & 
      (df["Actual Date"].str.contains("2015")) & 
      (df["Actual Date"].str.contains("2014")) & 
      (df["Actual Date"].str.contains("2011")) & 
      (df["Actual Date"].str.contains("(None)")) & 
      (df["Actual Date"].str.contains("N/A"))))]     

但是當我運行的代碼,我只收到了2011年,2014年和正則表達式不適用於2016年的日期。 我會很感激的幫助,遺憾的英語不好

回答

2

正則表達式是非常強大的工具,但在這種情況下,有一個更好的方法:

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 D型:

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 

UPDATE:如果你想在字符串D型,以保留原始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) 
+0

好的,我認爲最好的想法是將日期轉換爲日期時間,但是一些命運的值是None或NA,我也需要顯示這個值。任何選項做到這一點,因爲我認爲datetime不接受字符串。 代碼是這樣的 –

+0

我對原始文章 –

+0

進行了更新@CarlosArronteBello,你想在結果數據集中(過濾之後)有那些行'Date'是'None'或'NaN'嗎? – MaxU

相關問題