2016-04-14 41 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__或任何方法都会被调用。

相关问题