I'm trying to compare two dates. This code works:
import datetime
todays_date = datetime.date.today()
date1 = datetime.date(2006, 3, 15)
date2 = datetime.date(2009, 4, 30)
print(date1 != date2)
print(date1 == 0)
It produces:
True
False
Those code does not work and I don't know why:
import datetime
todays_date = datetime.date.today()
date1 = datetime.date(2006, 3, 15)
date2 = datetime.date(2009, 4, 30)
print(date1 != date2)
print(date1 >= 0)
It produces this error:
File 'datetime.py', Line 363: AttributeError: 'int' object has no attribute '__name__'
Note that all I changed was == to >=, why does equality comparison results in True or False, while greater than comparaison results in an error?
I would appreciate any help!
You can use equal to comparison operator = to check if one datetime object is has same value as other. In the following program, we initialize two datetime objects, and then check if both datetime objects have same date and time.
Use datetime. date() to compare two dates date objects representing the dates of year , month , and day . Use the built-in comparison operators (e.g. < , > , == ) to compare them.
Comparison between pandas timestamp objects is carried out using simple comparison operators: >, <,==,< = , >=. The difference can be calculated using a simple '–' operator.
It's because of how the comparison methods are defined.
Here's a copy of the source code for the time object:
def __eq__(self, other):
    if isinstance(other, time):
        return self._cmp(other, allow_mixed=True) == 0
    else:
        return False
def __ge__(self, other):
    if isinstance(other, time):
        return self._cmp(other) >= 0
    else:
        _cmperror(self, other)
__eq__ returns False when it's not another time instance, while __ge__ calls _cmperror, which is defined as followed:
def _cmperror(x, y):
    raise TypeError("can't compare '%s' to '%s'" % (
                    type(x).__name__, type(y).__name__))
Although this answer already got some positive scores, but I have miss read your question, you used date objects, not time objects.
First of all, date objects, unlike time objects, they are implemented the same for __eq__ and __ge__. Both of them actually returns NotImplemented, therefore there's nothing special about the date object's methods:
def __eq__(self, other):
    if isinstance(other, date):
        return self._cmp(other) == 0
    return NotImplemented
def __ge__(self, other):
    if isinstance(other, date):
        return self._cmp(other) >= 0
    return NotImplemented
What is different, however, is int's __eq__ comparison's to the other methods. int returns False when an object has a none-comparable type for __eq__ and NotImplemented for __ge__.
The NotImplemented returned by date will result in a fallback on int's methods. Since int is always equality comparable, date == 0 does not result in an error.
Here is an example:
class LikeDate:
    def __eq__(self, other):
         if isinstance(other, LikeDate):
             return True
         else:
              return NotImplemented
    def __ge__(self, other):
         if isinstance(other, LikeDate):
             return True
         else:
              return NotImplemented
class LikeInt:
    def __eq__(self, other):
         if isinstance(other, LikeInt):
             return True
         else:
             return False
    def __ge__(self, other):
         if isinstance(other, LikeInt):
             return True
         else:
              return NotImplemented
a = LikeDate()
b = LikeInt()
print(a == b) # False
print(a == 0) # False, because int provides an __eq__ method that returns False
print(a >= 0) # Error, because nether LikeDate nor int provides a definite comparison for __ge__
print(a >= b) # Error, because neither objects provide a comparable __ge__
You can run this example here.
If you do not know what return NotImplemented is, here's a short explanation and a quote from the doc:
When a binary [ (
__eq__,__ge__...) ] (or in-place) method returnsNotImplementedthe interpreter will try the reflected operation on the other type (or some other fallback, depending on the operator). If all attempts returnNotImplemented, the interpreter will raise an appropriate exception. Incorrectly returning NotImplemented will result in a misleading error message or theNotImplementedvalue being returned to Python code.
When NotImplemented is returned from a binary method, it refers that the binary method isn't able to compare itself with the targets' type. The result of the binary method will depend on the other objects' binary method. If both object returns NotImplemented an error is raised.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With