On 30 Jun 2015 00:56:26 GMT, Peter Pearson <pkpearson@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. -- https://mail.python.org/mailman/listinfo/python-list