2

Python 3.8.6

It is surprising that im not able to find the exact same errors in any google results but, it seems datetime's timedelta and relativedelta from relativedelta module cannot be compared. Here is the code to replicate:

from datetime import timedelta
from dateutil import relativedelta

timedelta(days=1) < relativedelta.relativedelta(days=1)

Output:

TypeError                                 Traceback (most recent call last)
<ipython-input-65-1444c9e4d5b8> in <module>
      2 from dateutil import relativedelta
      3 
----> 4 timedelta(days=1) < relativedelta.relativedelta(days=1)

TypeError: '<' not supported between instances of 'datetime.timedelta' and 'relativedelta'

I am also noticing similar incompatibility between timedelta64[ns] and relativedelta

Code to reproduce

import datetime
from dateutil import relativedelta
r1 = pd.date_range(start = datetime.datetime(2018,1,1),end=datetime.datetime(2018,4,1),periods=4)
r2 = pd.date_range(start = datetime.datetime(2018,2,1),end=datetime.datetime(2018,5,1),periods=4)

(r1-r1) < relativedelta.relativedelta(days=1)

Output:

InvalidComparison                         Traceback (most recent call last)
~/miniconda/envs/nyraml386/lib/python3.8/site-packages/pandas/core/arrays/datetimelike.py in wrapper(self, other)
    115         try:
--> 116             other = _validate_comparison_value(self, other)
    117         except InvalidComparison:

~/miniconda/envs/nyraml386/lib/python3.8/site-packages/pandas/core/arrays/datetimelike.py in _validate_comparison_value(self, other)
     95         elif not is_list_like(other):
---> 96             raise InvalidComparison(other)
     97 

InvalidComparison: relativedelta(days=+1)

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-75-57e9f57d40b9> in <module>
      4 r2 = pd.date_range(start = datetime.datetime(2018,2,1),end=datetime.datetime(2018,5,1),periods=4)
      5 
----> 6 (r1-r1) < relativedelta.relativedelta(days=1)

~/miniconda/envs/nyraml386/lib/python3.8/site-packages/pandas/core/indexes/extension.py in wrapper(self, other)
    127 
    128         op = getattr(self._data, opname)
--> 129         return op(other)
    130 
    131     wrapper.__name__ = opname

~/miniconda/envs/nyraml386/lib/python3.8/site-packages/pandas/core/ops/common.py in new_method(self, other)
     63         other = item_from_zerodim(other)
     64 
---> 65         return method(self, other)
     66 
     67     return new_method

~/miniconda/envs/nyraml386/lib/python3.8/site-packages/pandas/core/arrays/datetimelike.py in wrapper(self, other)
    116             other = _validate_comparison_value(self, other)
    117         except InvalidComparison:
--> 118             return invalid_comparison(self, other, op)
    119 
    120         dtype = getattr(other, "dtype", None)

~/miniconda/envs/nyraml386/lib/python3.8/site-packages/pandas/core/ops/invalid.py in invalid_comparison(left, right, op)
     32     else:
     33         typ = type(right).__name__
---> 34         raise TypeError(f"Invalid comparison between dtype={left.dtype} and {typ}")
     35     return res_values
     36 

TypeError: Invalid comparison between dtype=timedelta64[ns] and relativedelta

Have I misunderstood something very basic? It seems relativedelta is a no go territory. Is it? What is the best way to deal with timedeltas in python, pandas and numpy?

figs_and_nuts
  • 4,870
  • 2
  • 31
  • 56
  • You could use `pd.Timedelta(days=1)` which is `numpy` based. – Henry Yik Aug 07 '21 at 16:54
  • Thank you for your suggestion. I am looking for an understanding into relativedelta however. If there is any scenario where I might want to use relativedelta or, if it is never preferable to use relativedelta? – figs_and_nuts Aug 07 '21 at 16:58
  • Why not use either the datetime/timdelta module or the relativedelta module. Why do you need to use both? They don't store the same information. Anyway, you can always add to a datetime object and then compare the result. – misantroop Aug 07 '21 at 18:54
  • `relativedelta` is a duration relative to some point in time, while `timedelta` is not, it's just a duration. To me, it makes sense that a relative and an absolute quantity are not comparable in this case – FObersteiner Aug 07 '21 at 20:16

0 Answers0