2016-04-14 40 views
1

我試圖對Pandas DataFrame和Datetime對象進行比較。將大熊貓DataFrame與日期時間進行比較的錯誤

import pandas as pd 
from datetime import datetime 

df = pd.DataFrame({'date': [ datetime(2000, 1, 1)]}) 

# Works fine 
test1 = df['date'] >= datetime(2000, 1, 2) 
# Returns error 
test2 = datetime(2000, 1, 2) <= df['date'] 

導致這個錯誤:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-950-a1d9be25e98f> in <module>() 
     7 test1 = df['date'] >= datetime(2000, 1, 2) 
     8 # Returns error 
----> 9 test2 = datetime(2000, 1, 2) <= df['date'] 

TypeError: can't compare datetime.datetime to Series 

爲什麼沒有第二個比較工作?有沒有錯誤,或者這是一個不正確的方式來執行比較?


運行: Python 2.7版,熊貓0.18時,Windows 2010服務器,蟒蛇

+0

你有什麼numpy的版本,因爲這對我的作品:'TEST2 出[222]: 0假 名稱:迄今爲止,D類:bool' – EdChum

+0

@EdChum我已經numpy的1.10.4安裝在py27但這並不工作爲了我。你的numpy版本是什麼? –

+0

np是'1.10.4'熊貓是'0.18.0',但Python 3.4 64位 – EdChum

回答

2

我相當肯定,這是Python2.7的日期時間比較的怪癖:

請看下面的代碼比較datetime對象與比較對象的對象,該對象將等於任何對象與任何對象比較時引發NotImplemented的任何對象。

from datetime import datetime 

class ComparesEqualClass(object): 
    def __eq__(self, other): 
     return True 

    def __ne__(self, other): 
     return not self == other 

    def __lt__(self, other): 
     return False 

    def __gt__(self, other): 
     return False 

    __req__ = __eq__ 
    __rne__ = __ne__ 
    __rlt__ = __lt__ 
    __rgt__ = __gt__ 

ComparesEqual = ComparesEqualClass() 

if __name__ == "__main__": 
    print(ComparesEqual < datetime(2001, 1, 1)) 
    print(datetime(2001, 1, 1) < ComparesEqual) 

運行在2.7:

$ python2.7 comp_demo.py 
False 
Traceback (most recent call last): 
    File "comp_demo.py", line 29, in <module> 
    print(datetime(2001, 1, 1) < ComparesEqual) 
TypeError: can't compare datetime.datetime to ComparesEqualClass 

而且在3.5:

$ python3.5 comp_demo.py 
False 
False 

我想,右邊比較時的2.7 datetime對象是有點過於嚴格。只要確保Dataframe位於比較器的左側,並且應該沒有問題,因爲Dataframe的__lt____le__或任何方法都會被調用。

相關問題