Matplotlib X-axis timezone trouble

Peter Pearson pkpearson at nowhere.invalid
Wed Jul 1 07:50:17 CEST 2015


On 30 Jun 2015 00:56:26 GMT, Peter Pearson <pkpearson at nowhere.invalid> wrote:
> The following code produces a plot with a line running from (9:30, 0) to
> (10:30, 1), not from (8:30, 0) to (9:30, 1) as I desire.
>
> If I use timezone None instead of pacific, the plot is as desired, but
> of course that doesn't solve the general problem of which this is a
> much-reduced example.
>
> If I use timezone US/Central, I get the same (bad) plot.
>
> import matplotlib.pyplot as plt
> import datetime
> import pytz
> pacific = pytz.timezone("US/Pacific")
> fig = plt.figure()
> plt.plot([datetime.datetime(2014, 10, 7, 8, 30, tzinfo=pacific),
>           datetime.datetime(2014, 10, 7, 9, 30, tzinfo=pacific)],
>          [0,1], marker="o", color="green")
> fig.autofmt_xdate()
> plt.show()
>
> Does anybody know why this shift is occurring?  Is Matplotlib
> confused about what timezone to use in labeling the axis?  How
> would I tell it what timezone to use (preferably explicitly in
> the code, not in matplotlibrc)?

Progress report:

I might be wrong in blaming the axis formatting.  It looks as if the
datetimes themselves are being created wrong.

https://docs.python.org/2/library/datetime.html gives an
example like this:

    >>> # Daylight Saving Time
    >>> dt1 = datetime(2006, 11, 21, 16, 30, tzinfo=gmt1)
    >>> dt1.dst()
    datetime.timedelta(0)
    >>> dt1.utcoffset()
    datetime.timedelta(0, 3600)
    >>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=gmt1)
    >>> dt2.dst()
    datetime.timedelta(0, 3600)
    >>> dt2.utcoffset()
    datetime.timedelta(0, 7200)

... implying that adjustment for DST is made during the datetime constructor.
But look:

    >>> from datetime import datetime
    >>> import pytz
    >>> pacific = pytz.timezone("US/Pacific")
    >>> dt1 = datetime(2006, 11, 21, 16, 30, tzinfo=pacific) # no DST
    >>> dt2 = datetime(2006, 6, 14, 13, 0, tzinfo=pacific)   # yes DST
    >>> dt1.dst()
    datetime.timedelta(0)
    >>> dt2.dst()
    datetime.timedelta(0)
    >>> dt1.utcoffset()
    datetime.timedelta(-1, 57600)
    >>> dt2.utcoffset()
    datetime.timedelta(-1, 57600)

The dst() values are equal, and the utcoffset() values are equal, even
though one datetime is during DST and the other is not -- exactly the
opposite of the example.

The debugging tool pdb can't step into datetime.datetime(), so I'm
kinda stuck here.

-- 
To email me, substitute nowhere->runbox, invalid->com.


More information about the Python-list mailing list