Skip to content

bug: inconsistent types accepted in DateLocator subclasses #3897

@wholmgren

Description

@wholmgren

I've usually used np arrays, mostly out of habit, to construct my HourLocator and MinuteLocator objects, and today I was surprised to find that this did not work for MonthLocator objects. I also tested DayLocator and WeekdayLocator and found that they did not work with np arrays. The mpl docs suggest that the arguments can be "an int or sequence" -- not sure if this would include np arrays or not.

Not a big deal, but it did confuse me for a few minutes.

In [47]:

mpl.dates.DayLocator(np.arange(2,13,2))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-47-b23ea962d29f> in <module>()
----> 1 mpl.dates.DayLocator(np.arange(2,13,2))

/home/will/.virtualenvs/dev3/lib/python3.4/site-packages/matplotlib/dates.py in __init__(self, bymonthday, interval, tz)
   1097             bymonthday = list(xrange(1, 32))
   1098         o = rrulewrapper(DAILY, bymonthday=bymonthday,
-> 1099                          interval=interval, **self.hms0d)
   1100         RRuleLocator.__init__(self, o, tz)
   1101 

/home/will/.virtualenvs/dev3/lib/python3.4/site-packages/matplotlib/dates.py in __init__(self, freq, **kwargs)
    593         self._construct = kwargs.copy()
    594         self._construct["freq"] = freq
--> 595         self._rrule = rrule(**self._construct)
    596 
    597     def set(self, **kwargs):

/home/will/.virtualenvs/dev3/lib/python3.4/site-packages/dateutil/rrule.py in __init__(self, freq, dtstart, interval, wkst, count, until, bysetpos, bymonth, bymonthday, byyearday, byeaster, byweekno, byweekday, byhour, byminute, bysecond, cache)
    272                     raise ValueError("bysetpos must be between 1 and 366, "
    273                                      "or between -366 and -1")
--> 274         if not (byweekno or byyearday or bymonthday or
    275                 byweekday is not None or byeaster is not None):
    276             if freq == YEARLY:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

In [48]:

mpl.dates.HourLocator(np.arange(2,13,2))
Out[48]:
<matplotlib.dates.HourLocator at 0x7f05a2149470>
In [49]:

mpl.dates.MinuteLocator(np.arange(2,13,2))
Out[49]:
<matplotlib.dates.MinuteLocator at 0x7f05a1e941d0>
In [50]:

mpl.dates.MonthLocator(np.arange(2,13,2))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-50-971e82a6be3a> in <module>()
----> 1 mpl.dates.MonthLocator(np.arange(2,13,2))

/home/will/.virtualenvs/dev3/lib/python3.4/site-packages/matplotlib/dates.py in __init__(self, bymonth, bymonthday, interval, tz)
   1056             bymonth = list(xrange(1, 13))
   1057         o = rrulewrapper(MONTHLY, bymonth=bymonth, bymonthday=bymonthday,
-> 1058                          interval=interval, **self.hms0d)
   1059         RRuleLocator.__init__(self, o, tz)
   1060 

/home/will/.virtualenvs/dev3/lib/python3.4/site-packages/matplotlib/dates.py in __init__(self, freq, **kwargs)
    593         self._construct = kwargs.copy()
    594         self._construct["freq"] = freq
--> 595         self._rrule = rrule(**self._construct)
    596 
    597     def set(self, **kwargs):

/home/will/.virtualenvs/dev3/lib/python3.4/site-packages/dateutil/rrule.py in __init__(self, freq, dtstart, interval, wkst, count, until, bysetpos, bymonth, bymonthday, byyearday, byeaster, byweekno, byweekday, byhour, byminute, bysecond, cache)
    283                 byweekday = dtstart.weekday()
    284         # bymonth
--> 285         if not bymonth:
    286             self._bymonth = None
    287         elif isinstance(bymonth, integer_types):

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

In [51]:

mpl.dates.SecondLocator(np.arange(2,13,2))
Out[51]:
<matplotlib.dates.SecondLocator at 0x7f05a1f25d68>
In [52]:

mpl.dates.WeekdayLocator(np.arange(2,13,2))
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-52-94aba8a8506e> in <module>()
----> 1 mpl.dates.WeekdayLocator(np.arange(2,13,2))

/home/will/.virtualenvs/dev3/lib/python3.4/site-packages/matplotlib/dates.py in __init__(self, byweekday, interval, tz)
   1079         o = rrulewrapper(DAILY, byweekday=byweekday,
-> 1080                          interval=interval, **self.hms0d)
   1081         RRuleLocator.__init__(self, o, tz)
   1082 

/home/will/.virtualenvs/dev3/lib/python3.4/site-packages/matplotlib/dates.py in __init__(self, freq, **kwargs)
    593         self._construct = kwargs.copy()
    594         self._construct["freq"] = freq
--> 595         self._rrule = rrule(**self._construct)
    596 
    597     def set(self, **kwargs):

/home/will/.virtualenvs/dev3/lib/python3.4/site-packages/dateutil/rrule.py in __init__(self, freq, dtstart, interval, wkst, count, until, bysetpos, bymonth, bymonthday, byyearday, byeaster, byweekno, byweekday, byhour, byminute, bysecond, cache)
    347                 if isinstance(wday, integer_types):
    348                     self._byweekday.append(wday)
--> 349                 elif not wday.n or freq > MONTHLY:
    350                     self._byweekday.append(wday.weekday)
    351                 else:

AttributeError: 'numpy.int64' object has no attribute 'n'

In [53]:

mpl.dates.MonthLocator(np.arange(2,13,2).tolist())
Out[53]:
<matplotlib.dates.MonthLocator at 0x7f05a20a0ba8>

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions