MonthLocator doesn't honour rrule bymonthday -1 value for last day of month

Hi all,

From http://labix.org/python-dateutil

"To generate a rrule for the use case of "a date on the specified day of the month, unless it is beyond the end of month, in which case it will be the last day of the month" use the following:

rrule(MONTHLY, bymonthday=(some_day, -1), bysetpos=1)

This will generate a value for every calendar month regardless of the day of the month it is started from."

Using bymonthday with MonthLocator gives ticks on the day given and the last day of the month, which looks extremely ugly. Code below demonstrates.

from dateutil.rrule import *
import datetime
import matplotlib.pyplot as plt
from matplotlib.ticker import FormatStrFormatter, MultipleLocator
from matplotlib.dates import DateFormatter, MonthLocator, DayLocator

start = datetime.date(2013, 3, 29)
until = datetime.date(2014, 3, 29)
dates = rrule(MONTHLY, bymonthday=(29, -1), bysetpos=1, until=until)
for d in dates:print(d)

dates = [start, until]
values = [0, 1]
plt.ylabel('Balance')
plt.grid()
ax = plt.subplot(111)
plt.plot_date(dates, values, fmt = 'rx-')
ax.xaxis.set_major_locator(MonthLocator(bymonthday = (dates[0].day, -1)))
ax.xaxis.set_major_formatter(DateFormatter('%d/%m/%y'))
ax.yaxis.set_major_formatter(FormatStrFormatter('�%0.2f'))
ax.yaxis.set_minor_locator(MultipleLocator(5))
plt.axis(xmin=dates[0], xmax=dates[-1])
plt.setp(plt.gca().get_xticklabels(), rotation = 45, fontsize = 10)
plt.setp(plt.gca().get_yticklabels(), fontsize = 10)
plt.show()

···

--
If you're using GoogleCrap� please read this http://wiki.python.org/moin/GoogleGroupsPython.

Mark Lawrence

Seems an apt date to realise that I didn't say much :frowning:

Assuming that I'm correct would you like an issue raised on the bug tracker? If not please correct the mistake I've made, presumably in reading the docs, which I think are excellent by the way.

···

On 29/03/2013 15:49, Mark Lawrence wrote:

Hi all,

  From python-dateutil - Labix

"To generate a rrule for the use case of "a date on the specified day of
the month, unless it is beyond the end of month, in which case it will
be the last day of the month" use the following:

rrule(MONTHLY, bymonthday=(some_day, -1), bysetpos=1)

This will generate a value for every calendar month regardless of the
day of the month it is started from."

Using bymonthday with MonthLocator gives ticks on the day given and the
last day of the month, which looks extremely ugly. Code below demonstrates.

from dateutil.rrule import *
import datetime
import matplotlib.pyplot as plt
from matplotlib.ticker import FormatStrFormatter, MultipleLocator
from matplotlib.dates import DateFormatter, MonthLocator, DayLocator

start = datetime.date(2013, 3, 29)
until = datetime.date(2014, 3, 29)
dates = rrule(MONTHLY, bymonthday=(29, -1), bysetpos=1, until=until)
for d in dates:print(d)

dates = [start, until]
values = [0, 1]
plt.ylabel('Balance')
plt.grid()
ax = plt.subplot(111)
plt.plot_date(dates, values, fmt = 'rx-')
ax.xaxis.set_major_locator(MonthLocator(bymonthday = (dates[0].day, -1)))
ax.xaxis.set_major_formatter(DateFormatter('%d/%m/%y'))
ax.yaxis.set_major_formatter(FormatStrFormatter('�%0.2f'))
ax.yaxis.set_minor_locator(MultipleLocator(5))
plt.axis(xmin=dates[0], xmax=dates[-1])
plt.setp(plt.gca().get_xticklabels(), rotation = 45, fontsize = 10)
plt.setp(plt.gca().get_yticklabels(), fontsize = 10)
plt.show()

--
If you're using GoogleCrap� please read this GoogleGroupsPython - Python Wiki.

Mark Lawrence

Anybody?

···

On 01/04/2013 14:48, Mark Lawrence wrote:

On 29/03/2013 15:49, Mark Lawrence wrote:

Hi all,

   From python-dateutil - Labix

"To generate a rrule for the use case of "a date on the specified day of
the month, unless it is beyond the end of month, in which case it will
be the last day of the month" use the following:

rrule(MONTHLY, bymonthday=(some_day, -1), bysetpos=1)

This will generate a value for every calendar month regardless of the
day of the month it is started from."

Using bymonthday with MonthLocator gives ticks on the day given and the
last day of the month, which looks extremely ugly. Code below demonstrates.

from dateutil.rrule import *
import datetime
import matplotlib.pyplot as plt
from matplotlib.ticker import FormatStrFormatter, MultipleLocator
from matplotlib.dates import DateFormatter, MonthLocator, DayLocator

start = datetime.date(2013, 3, 29)
until = datetime.date(2014, 3, 29)
dates = rrule(MONTHLY, bymonthday=(29, -1), bysetpos=1, until=until)
for d in dates:print(d)

dates = [start, until]
values = [0, 1]
plt.ylabel('Balance')
plt.grid()
ax = plt.subplot(111)
plt.plot_date(dates, values, fmt = 'rx-')
ax.xaxis.set_major_locator(MonthLocator(bymonthday = (dates[0].day, -1)))
ax.xaxis.set_major_formatter(DateFormatter('%d/%m/%y'))
ax.yaxis.set_major_formatter(FormatStrFormatter('�%0.2f'))
ax.yaxis.set_minor_locator(MultipleLocator(5))
plt.axis(xmin=dates[0], xmax=dates[-1])
plt.setp(plt.gca().get_xticklabels(), rotation = 45, fontsize = 10)
plt.setp(plt.gca().get_yticklabels(), fontsize = 10)
plt.show()

Seems an apt date to realise that I didn't say much :frowning:

Assuming that I'm correct would you like an issue raised on the bug
tracker? If not please correct the mistake I've made, presumably in
reading the docs, which I think are excellent by the way.

--
If you're using GoogleCrap� please read this GoogleGroupsPython - Python Wiki.

Mark Lawrence

Hi Mark,

Thanks for persevering :slight_smile:

What is it you want to achieve? Is it that you just want the last day of each month as the located value?

Changing your locator to:

ax.xaxis.set_major_locator(MonthLocator(bymonthday = -1))

Seems to do the trick for me (I’ve never looked at the mpl date magic, so I can give no guarantees).

HTH,

···

On 4 April 2013 17:18, Mark Lawrence <breamoreboy@…225…> wrote:

On 01/04/2013 14:48, Mark Lawrence wrote:

On 29/03/2013 15:49, Mark Lawrence wrote:

Hi all,

From http://labix.org/python-dateutil

"To generate a rrule for the use case of "a date on the specified day of

the month, unless it is beyond the end of month, in which case it will

be the last day of the month" use the following:

rrule(MONTHLY, bymonthday=(some_day, -1), bysetpos=1)

This will generate a value for every calendar month regardless of the

day of the month it is started from."

Using bymonthday with MonthLocator gives ticks on the day given and the

last day of the month, which looks extremely ugly. Code below demonstrates.

from dateutil.rrule import *

import datetime

import matplotlib.pyplot as plt

from matplotlib.ticker import FormatStrFormatter, MultipleLocator

from matplotlib.dates import DateFormatter, MonthLocator, DayLocator

start = datetime.date(2013, 3, 29)

until = datetime.date(2014, 3, 29)

dates = rrule(MONTHLY, bymonthday=(29, -1), bysetpos=1, until=until)

for d in dates:print(d)

dates = [start, until]

values = [0, 1]

plt.ylabel(‘Balance’)

plt.grid()

ax = plt.subplot(111)

plt.plot_date(dates, values, fmt = ‘rx-’)

ax.xaxis.set_major_locator(MonthLocator(bymonthday = (dates[0].day, -1)))

ax.xaxis.set_major_formatter(DateFormatter(‘%d/%m/%y’))

ax.yaxis.set_major_formatter(FormatStrFormatter(‘£%0.2f’))

ax.yaxis.set_minor_locator(MultipleLocator(5))

plt.axis(xmin=dates[0], xmax=dates[-1])

plt.setp(plt.gca().get_xticklabels(), rotation = 45, fontsize = 10)

plt.setp(plt.gca().get_yticklabels(), fontsize = 10)

plt.show()

Seems an apt date to realise that I didn’t say much :frowning:

Assuming that I’m correct would you like an issue raised on the bug

tracker? If not please correct the mistake I’ve made, presumably in

reading the docs, which I think are excellent by the way.

Anybody?

If you’re using GoogleCrap™ please read this

http://wiki.python.org/moin/GoogleGroupsPython.

Mark Lawrence


Minimize network downtime and maximize team effectiveness.

Reduce network management and security costs.Learn how to hire

the most talented Cisco Certified professionals. Visit the

Employer Resources Portal

http://www.cisco.com/web/learning/employer_resources/index.html


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Sadly no :frowning: I want the day of the month that I'm processing *OR* the last day. The worst case for this is obviously the 31st of each month. The rrule code I've given provides exactly that. When transferred to mpl that doesn't work.

···

On 04/04/2013 17:31, Phil Elson wrote:

Hi Mark,

Thanks for persevering :slight_smile:

What is it you want to achieve? Is it that you just want the last day of
each month as the located value?

Changing your locator to:

ax.xaxis.set_major_locator(MonthLocator(bymonthday = -1))

Seems to do the trick for me (I've never looked at the mpl date magic,
so I can give no guarantees).

HTH,

On 4 April 2013 17:18, Mark Lawrence > <breamoreboy@...225... > <mailto:breamoreboy@…225…>> wrote:

    On 01/04/2013 14:48, Mark Lawrence wrote:
     > On 29/03/2013 15:49, Mark Lawrence wrote:
     >> Hi all,
     >>
     >> From python-dateutil - Labix
     >>
     >> "To generate a rrule for the use case of "a date on the
    specified day of
     >> the month, unless it is beyond the end of month, in which case
    it will
     >> be the last day of the month" use the following:
     >>
     >> rrule(MONTHLY, bymonthday=(some_day, -1), bysetpos=1)
     >>
     >> This will generate a value for every calendar month regardless
    of the
     >> day of the month it is started from."
     >>
     >> Using bymonthday with MonthLocator gives ticks on the day given
    and the
     >> last day of the month, which looks extremely ugly. Code below
    demonstrates.
     >>
     >> from dateutil.rrule import *
     >> import datetime
     >> import matplotlib.pyplot as plt
     >> from matplotlib.ticker import FormatStrFormatter, MultipleLocator
     >> from matplotlib.dates import DateFormatter, MonthLocator, DayLocator
     >>
     >> start = datetime.date(2013, 3, 29)
     >> until = datetime.date(2014, 3, 29)
     >> dates = rrule(MONTHLY, bymonthday=(29, -1), bysetpos=1, until=until)
     >> for d in dates:print(d)
     >>
     >> dates = [start, until]
     >> values = [0, 1]
     >> plt.ylabel('Balance')
     >> plt.grid()
     >> ax = plt.subplot(111)
     >> plt.plot_date(dates, values, fmt = 'rx-')
     >> ax.xaxis.set_major_locator(MonthLocator(bymonthday =
    (dates[0].day, -1)))
     >> ax.xaxis.set_major_formatter(DateFormatter('%d/%m/%y'))
     >> ax.yaxis.set_major_formatter(FormatStrFormatter('�%0.2f'))
     >> ax.yaxis.set_minor_locator(MultipleLocator(5))
     >> plt.axis(xmin=dates[0], xmax=dates[-1])
     >> plt.setp(plt.gca().get_xticklabels(), rotation = 45, fontsize = 10)
     >> plt.setp(plt.gca().get_yticklabels(), fontsize = 10)
     >> plt.show()
     >>
     >
     > Seems an apt date to realise that I didn't say much :frowning:
     >
     > Assuming that I'm correct would you like an issue raised on the bug
     > tracker? If not please correct the mistake I've made, presumably in
     > reading the docs, which I think are excellent by the way.
     >

    Anybody?

    --
    If you're using GoogleCrap� please read this
    GoogleGroupsPython - Python Wiki.

--
If you're using GoogleCrap� please read this GoogleGroupsPython - Python Wiki.

Mark Lawrence

Sadly no :frowning: I want the day of the month that I'm processing *OR* the
last day. The worst case for this is obviously the 31st of each month.
   The rrule code I've given provides exactly that. When transferred to
mpl that doesn't work.

Best seen by changing the lines I gave originally to this.

start = datetime.date(2013, 4, 5)
until = datetime.date(2014, 4, 5)
dates = rrule(MONTHLY, bymonthday=(5, -1), bysetpos=1, until=until)

rrule output as follows.

2013-04-05 10:15:24
2013-05-05 10:15:24
2013-06-05 10:15:24
2013-07-05 10:15:24
2013-08-05 10:15:24
2013-09-05 10:15:24
2013-10-05 10:15:24
2013-11-05 10:15:24
2013-12-05 10:15:24
2014-01-05 10:15:24
2014-02-05 10:15:24
2014-03-05 10:15:24

Plot attached.

···

On 04/04/2013 19:00, Mark Lawrence wrote:

On 04/04/2013 17:31, Phil Elson wrote:

Hi Mark,

Thanks for persevering :slight_smile:

What is it you want to achieve? Is it that you just want the last day of
each month as the located value?

Changing your locator to:

ax.xaxis.set_major_locator(MonthLocator(bymonthday = -1))

Seems to do the trick for me (I've never looked at the mpl date magic,
so I can give no guarantees).

HTH,

On 4 April 2013 17:18, Mark Lawrence >> <breamoreboy@...225... >> <mailto:breamoreboy@…225…>> wrote:

     On 01/04/2013 14:48, Mark Lawrence wrote:
      > On 29/03/2013 15:49, Mark Lawrence wrote:
      >> Hi all,
      >>
      >> From python-dateutil - Labix
      >>
      >> "To generate a rrule for the use case of "a date on the
     specified day of
      >> the month, unless it is beyond the end of month, in which case
     it will
      >> be the last day of the month" use the following:
      >>
      >> rrule(MONTHLY, bymonthday=(some_day, -1), bysetpos=1)
      >>
      >> This will generate a value for every calendar month regardless
     of the
      >> day of the month it is started from."
      >>
      >> Using bymonthday with MonthLocator gives ticks on the day given
     and the
      >> last day of the month, which looks extremely ugly. Code below
     demonstrates.
      >>
      >> from dateutil.rrule import *
      >> import datetime
      >> import matplotlib.pyplot as plt
      >> from matplotlib.ticker import FormatStrFormatter, MultipleLocator
      >> from matplotlib.dates import DateFormatter, MonthLocator, DayLocator
      >>
      >> start = datetime.date(2013, 3, 29)
      >> until = datetime.date(2014, 3, 29)
      >> dates = rrule(MONTHLY, bymonthday=(29, -1), bysetpos=1, until=until)
      >> for d in dates:print(d)
      >>
      >> dates = [start, until]
      >> values = [0, 1]
      >> plt.ylabel('Balance')
      >> plt.grid()
      >> ax = plt.subplot(111)
      >> plt.plot_date(dates, values, fmt = 'rx-')
      >> ax.xaxis.set_major_locator(MonthLocator(bymonthday =
     (dates[0].day, -1)))
      >> ax.xaxis.set_major_formatter(DateFormatter('%d/%m/%y'))
      >> ax.yaxis.set_major_formatter(FormatStrFormatter('�%0.2f'))
      >> ax.yaxis.set_minor_locator(MultipleLocator(5))
      >> plt.axis(xmin=dates[0], xmax=dates[-1])
      >> plt.setp(plt.gca().get_xticklabels(), rotation = 45, fontsize = 10)
      >> plt.setp(plt.gca().get_yticklabels(), fontsize = 10)
      >> plt.show()
      >>
      >
      > Seems an apt date to realise that I didn't say much :frowning:
      >
      > Assuming that I'm correct would you like an issue raised on the bug
      > tracker? If not please correct the mistake I've made, presumably in
      > reading the docs, which I think are excellent by the way.
      >

     Anybody?

     --
     If you're using GoogleCrap� please read this
     GoogleGroupsPython - Python Wiki.

--
If you're using GoogleCrap� please read this GoogleGroupsPython - Python Wiki.

Mark Lawrence

I've found the solution. MonthLocator doesn't support the bysetpos argument that rrule can use. Thankfully from my POV the following two lines give me exactly what I want.

rule = rrulewrapper(MONTHLY, bymonthday=(firstDate.day, -1), bysetpos=1)
majorLocator = RRuleLocator(rule)

Just wish I'd read the docs more carefully in the first place to save my time and yours.

···

On 05/04/2013 10:17, Mark Lawrence wrote:

On 04/04/2013 19:00, Mark Lawrence wrote:

Sadly no :frowning: I want the day of the month that I'm processing *OR* the
last day. The worst case for this is obviously the 31st of each month.
   The rrule code I've given provides exactly that. When transferred to
mpl that doesn't work.

Best seen by changing the lines I gave originally to this.

start = datetime.date(2013, 4, 5)
until = datetime.date(2014, 4, 5)
dates = rrule(MONTHLY, bymonthday=(5, -1), bysetpos=1, until=until)

rrule output as follows.

2013-04-05 10:15:24
2013-05-05 10:15:24
2013-06-05 10:15:24
2013-07-05 10:15:24
2013-08-05 10:15:24
2013-09-05 10:15:24
2013-10-05 10:15:24
2013-11-05 10:15:24
2013-12-05 10:15:24
2014-01-05 10:15:24
2014-02-05 10:15:24
2014-03-05 10:15:24

Plot attached.

On 04/04/2013 17:31, Phil Elson wrote:

Hi Mark,

Thanks for persevering :slight_smile:

What is it you want to achieve? Is it that you just want the last day of
each month as the located value?

Changing your locator to:

ax.xaxis.set_major_locator(MonthLocator(bymonthday = -1))

Seems to do the trick for me (I've never looked at the mpl date magic,
so I can give no guarantees).

HTH,

On 4 April 2013 17:18, Mark Lawrence >>> <breamoreboy@...225... >>> <mailto:breamoreboy@…225…>> wrote:

     On 01/04/2013 14:48, Mark Lawrence wrote:
      > On 29/03/2013 15:49, Mark Lawrence wrote:
      >> Hi all,
      >>
      >> From python-dateutil - Labix
      >>
      >> "To generate a rrule for the use case of "a date on the
     specified day of
      >> the month, unless it is beyond the end of month, in which case
     it will
      >> be the last day of the month" use the following:
      >>
      >> rrule(MONTHLY, bymonthday=(some_day, -1), bysetpos=1)
      >>
      >> This will generate a value for every calendar month regardless
     of the
      >> day of the month it is started from."
      >>
      >> Using bymonthday with MonthLocator gives ticks on the day given
     and the
      >> last day of the month, which looks extremely ugly. Code below
     demonstrates.
      >>
      >> from dateutil.rrule import *
      >> import datetime
      >> import matplotlib.pyplot as plt
      >> from matplotlib.ticker import FormatStrFormatter,
MultipleLocator
      >> from matplotlib.dates import DateFormatter, MonthLocator,
DayLocator
      >>
      >> start = datetime.date(2013, 3, 29)
      >> until = datetime.date(2014, 3, 29)
      >> dates = rrule(MONTHLY, bymonthday=(29, -1), bysetpos=1,
until=until)
      >> for d in dates:print(d)
      >>
      >> dates = [start, until]
      >> values = [0, 1]
      >> plt.ylabel('Balance')
      >> plt.grid()
      >> ax = plt.subplot(111)
      >> plt.plot_date(dates, values, fmt = 'rx-')
      >> ax.xaxis.set_major_locator(MonthLocator(bymonthday =
     (dates[0].day, -1)))
      >> ax.xaxis.set_major_formatter(DateFormatter('%d/%m/%y'))
      >> ax.yaxis.set_major_formatter(FormatStrFormatter('�%0.2f'))
      >> ax.yaxis.set_minor_locator(MultipleLocator(5))
      >> plt.axis(xmin=dates[0], xmax=dates[-1])
      >> plt.setp(plt.gca().get_xticklabels(), rotation = 45,
fontsize = 10)
      >> plt.setp(plt.gca().get_yticklabels(), fontsize = 10)
      >> plt.show()
      >>
      >
      > Seems an apt date to realise that I didn't say much :frowning:
      >
      > Assuming that I'm correct would you like an issue raised on
the bug
      > tracker? If not please correct the mistake I've made,
presumably in
      > reading the docs, which I think are excellent by the way.
      >

     Anybody?

     --
     If you're using GoogleCrap� please read this
     GoogleGroupsPython - Python Wiki.

--
If you're using GoogleCrap� please read this GoogleGroupsPython - Python Wiki.

Mark Lawrence