Difference between revisions of "Matplotlib dateutil bug"
Jump to navigation
Jump to search
(Created page with "== Background == == See also == Category:matplotlib") |
|||
| Line 1: | Line 1: | ||
== Background == | == Background == | ||
| + | When you create a range in relax, it is created as an xrange object.<br> | ||
| + | |||
| + | You cannot by default slice through xrange objects. | ||
| + | |||
| + | The '''dateutil.rrule''' package used in matplotlib/pylab creates some list, which it expects it can slice through.<br> | ||
| + | But relax will create these as '''xrange''' which is not-sliceable. | ||
| + | |||
| + | Let's try it out. | ||
| + | |||
| + | <source lang="python"> | ||
| + | USER@MACHINE: $ python | ||
| + | |||
| + | >>> x=range(10) | ||
| + | >>> type(x) | ||
| + | <type 'list'> | ||
| + | >>> print x[:3] | ||
| + | [0, 1, 2] | ||
| + | >>> y=xrange(10) | ||
| + | >>> type(y) | ||
| + | <type 'xrange'> | ||
| + | >>> print y[:3] | ||
| + | Traceback (most recent call last): | ||
| + | File "<stdin>", line 1, in <module> | ||
| + | TypeError: sequence index must be integer, not 'slice' | ||
| + | </source> | ||
| + | |||
| + | <source lang="python"> | ||
| + | USER@MACHINE: $ relax | ||
| + | |||
| + | relax> x=range(10) | ||
| + | relax> type(x) | ||
| + | <type 'xrange'> | ||
| + | relax> print x[:3] | ||
| + | Traceback (most recent call last): | ||
| + | File "<console>", line 1, in <module> | ||
| + | TypeError: sequence index must be integer, not 'slice' | ||
| + | relax> y=list(range(10)) | ||
| + | relax> print y[:3] | ||
| + | [0, 1, 2] | ||
| + | relax> | ||
| + | </source> | ||
| + | |||
| + | == The error when importing matplotlib / pyplot == | ||
| + | <source lang="python"> | ||
| + | USER@MACHINE: $ relax | ||
| + | |||
| + | relax> from pylab import * | ||
| + | Traceback (most recent call last): | ||
| + | File "<console>", line 1, in <module> | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/pylab.py", line 1, in <module> | ||
| + | from matplotlib.pylab import * | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/pylab.py", line 221, in <module> | ||
| + | from matplotlib import mpl # pulls in most modules | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/mpl.py", line 3, in <module> | ||
| + | from matplotlib import axes | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/axes.py", line 19, in <module> | ||
| + | import matplotlib.dates as mdates | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/dates.py", line 119, in <module> | ||
| + | from dateutil.rrule import rrule, MO, TU, WE, TH, FR, SA, SU, YEARLY, \ | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/dateutil/rrule.py", line 26, in <module> | ||
| + | MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) | ||
| + | TypeError: unsupported operand type(s) for +: 'xrange' and 'xrange' | ||
| + | </source> | ||
| + | |||
| + | == Change bug == | ||
| + | <source lang="bash"> | ||
| + | bash | ||
| + | MFILE=`python -c "import dateutil.rrule; print(dateutil.rrule.__file__)"` | ||
| + | echo $MFILE | ||
| + | |||
| + | </source> | ||
| + | |||
| + | Test if it worked | ||
| + | <source lang="bash"> | ||
| + | $ relax | ||
| + | relax> from pylab import * | ||
| + | Traceback (most recent call last): | ||
| + | File "<console>", line 1, in <module> | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/pylab.py", line 1, in <module> | ||
| + | from matplotlib.pylab import * | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/pylab.py", line 221, in <module> | ||
| + | from matplotlib import mpl # pulls in most modules | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/mpl.py", line 3, in <module> | ||
| + | from matplotlib import axes | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/axes.py", line 19, in <module> | ||
| + | import matplotlib.dates as mdates | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/dates.py", line 119, in <module> | ||
| + | from dateutil.rrule import rrule, MO, TU, WE, TH, FR, SA, SU, YEARLY, \ | ||
| + | File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/dateutil/rrule.py", line 26, in <module> | ||
| + | MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7]) | ||
| + | TypeError: unsupported operand type(s) for +: 'xrange' and 'xrange' | ||
| + | </source> | ||
== See also == | == See also == | ||
[[Category:matplotlib]] | [[Category:matplotlib]] | ||
Revision as of 12:47, 10 December 2013
Background
When you create a range in relax, it is created as an xrange object.
You cannot by default slice through xrange objects.
The dateutil.rrule package used in matplotlib/pylab creates some list, which it expects it can slice through.
But relax will create these as xrange which is not-sliceable.
Let's try it out.
USER@MACHINE: $ python
>>> x=range(10)
>>> type(x)
<type 'list'>
>>> print x[:3]
[0, 1, 2]
>>> y=xrange(10)
>>> type(y)
<type 'xrange'>
>>> print y[:3]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence index must be integer, not 'slice'
USER@MACHINE: $ relax
relax> x=range(10)
relax> type(x)
<type 'xrange'>
relax> print x[:3]
Traceback (most recent call last):
File "<console>", line 1, in <module>
TypeError: sequence index must be integer, not 'slice'
relax> y=list(range(10))
relax> print y[:3]
[0, 1, 2]
relax>
The error when importing matplotlib / pyplot
USER@MACHINE: $ relax
relax> from pylab import *
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/pylab.py", line 1, in <module>
from matplotlib.pylab import *
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/pylab.py", line 221, in <module>
from matplotlib import mpl # pulls in most modules
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/mpl.py", line 3, in <module>
from matplotlib import axes
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/axes.py", line 19, in <module>
import matplotlib.dates as mdates
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/dates.py", line 119, in <module>
from dateutil.rrule import rrule, MO, TU, WE, TH, FR, SA, SU, YEARLY, \
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/dateutil/rrule.py", line 26, in <module>
MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7])
TypeError: unsupported operand type(s) for +: 'xrange' and 'xrange'
Change bug
bash
MFILE=`python -c "import dateutil.rrule; print(dateutil.rrule.__file__)"`
echo $MFILE
Test if it worked
$ relax
relax> from pylab import *
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/pylab.py", line 1, in <module>
from matplotlib.pylab import *
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/pylab.py", line 221, in <module>
from matplotlib import mpl # pulls in most modules
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/mpl.py", line 3, in <module>
from matplotlib import axes
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/axes.py", line 19, in <module>
import matplotlib.dates as mdates
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/matplotlib/dates.py", line 119, in <module>
from dateutil.rrule import rrule, MO, TU, WE, TH, FR, SA, SU, YEARLY, \
File "/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/dateutil/rrule.py", line 26, in <module>
MDAY366MASK = tuple(M31+M29+M31+M30+M31+M30+M31+M31+M30+M31+M30+M31+M31[:7])
TypeError: unsupported operand type(s) for +: 'xrange' and 'xrange'