Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1d5b5dc

Browse files
committed
FIX: properly set tz for YearLocator
TST: added test...
1 parent ad779b4 commit 1d5b5dc

File tree

2 files changed

+83
-6
lines changed

2 files changed

+83
-6
lines changed

lib/matplotlib/dates.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,7 +1183,7 @@ def __init__(self, tz=None, minticks=5, maxticks=None,
11831183
locator.intervald[HOURLY] = [3] # only show every 3 hours
11841184
"""
11851185
DateLocator.__init__(self, tz)
1186-
self._locator = YearLocator()
1186+
self._locator = YearLocator(tz=tz)
11871187
self._freq = YEARLY
11881188
self._freqs = [YEARLY, MONTHLY, DAILY, HOURLY, MINUTELY,
11891189
SECONDLY, MICROSECONDLY]
@@ -1338,7 +1338,7 @@ def get_locator(self, dmin, dmax):
13381338
'AutoDateLocator.')
13391339

13401340
if (freq == YEARLY) and self.interval_multiples:
1341-
locator = YearLocator(interval)
1341+
locator = YearLocator(interval, tz=self.tz)
13421342
elif use_rrule_locator[i]:
13431343
_, bymonth, bymonthday, byhour, byminute, bysecond, _ = byranges
13441344
rrule = rrulewrapper(self._freq, interval=interval,
@@ -1387,8 +1387,9 @@ def __init__(self, base=1, month=1, day=1, tz=None):
13871387
'hour': 0,
13881388
'minute': 0,
13891389
'second': 0,
1390-
'tzinfo': tz
13911390
}
1391+
# Note that tzinfo does not work with pytz timezones, so
1392+
# we need to set this here, and convert using astimezone
13921393

13931394
def __call__(self):
13941395
# if no data have been set, this will tank with a ValueError
@@ -1403,13 +1404,14 @@ def tick_values(self, vmin, vmax):
14031404
ymin = self.base.le(vmin.year) * self.base.step
14041405
ymax = self.base.ge(vmax.year) * self.base.step
14051406

1406-
ticks = [vmin.replace(year=ymin, **self.replaced)]
1407+
ticks = [vmin.replace(year=ymin, **self.replaced).astimezone(self.tz)]
14071408
while True:
14081409
dt = ticks[-1]
14091410
if dt.year >= ymax:
14101411
return date2num(ticks)
14111412
year = dt.year + self.base.step
1412-
ticks.append(dt.replace(year=year, **self.replaced))
1413+
dt = dt.replace(year=year, **self.replaced).astimezone(self.tz)
1414+
ticks.append(dt)
14131415

14141416
def autoscale(self):
14151417
"""
@@ -1420,7 +1422,9 @@ def autoscale(self):
14201422
ymin = self.base.le(dmin.year)
14211423
ymax = self.base.ge(dmax.year)
14221424
vmin = dmin.replace(year=ymin, **self.replaced)
1425+
vmin = vmin.astimezone(self.tz)
14231426
vmax = dmax.replace(year=ymax, **self.replaced)
1427+
vmax = vmax.astimezone(self.tz)
14241428

14251429
vmin = date2num(vmin)
14261430
vmax = date2num(vmax)

lib/matplotlib/tests/test_dates.py

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,6 @@ def _create_auto_date_locator(date1, date2):
406406
mdates.date2num(date2))
407407
return locator
408408

409-
d1 = datetime.datetime(1997, 1, 1)
410409
results = ([datetime.timedelta(weeks=52 * 200),
411410
['1980-01-01 00:00:00+00:00', '2000-01-01 00:00:00+00:00',
412411
'2020-01-01 00:00:00+00:00', '2040-01-01 00:00:00+00:00',
@@ -467,12 +466,86 @@ def _create_auto_date_locator(date1, date2):
467466
],
468467
)
469468

469+
d1 = datetime.datetime(1997, 1, 1)
470470
for t_delta, expected in results:
471471
d2 = d1 + t_delta
472472
locator = _create_auto_date_locator(d1, d2)
473473
assert list(map(str, mdates.num2date(locator()))) == expected
474474

475475

476+
@pytest.mark.pytz
477+
@pytest.mark.skipif(not __has_pytz(), reason="Requires pytz")
478+
def test_auto_date_locator_intmult_tz():
479+
import pytz
480+
481+
def _create_auto_date_locator(date1, date2):
482+
locator = mdates.AutoDateLocator(interval_multiples=True, tz=tz)
483+
locator.create_dummy_axis()
484+
locator.set_view_interval(mdates.date2num(date1),
485+
mdates.date2num(date2))
486+
return locator
487+
488+
results = ([datetime.timedelta(weeks=52 * 200),
489+
['1980-01-01 00:00:00-08:00', '2000-01-01 00:00:00-08:00',
490+
'2020-01-01 00:00:00-08:00', '2040-01-01 00:00:00-08:00',
491+
'2060-01-01 00:00:00-08:00', '2080-01-01 00:00:00-08:00',
492+
'2100-01-01 00:00:00-08:00', '2120-01-01 00:00:00-08:00',
493+
'2140-01-01 00:00:00-08:00', '2160-01-01 00:00:00-08:00',
494+
'2180-01-01 00:00:00-08:00', '2200-01-01 00:00:00-08:00']
495+
],
496+
[datetime.timedelta(weeks=52),
497+
['1997-01-01 00:00:00-08:00', '1997-02-01 00:00:00-08:00',
498+
'1997-03-01 00:00:00-08:00', '1997-04-01 00:00:00-08:00',
499+
'1997-05-01 00:00:00-07:00', '1997-06-01 00:00:00-07:00',
500+
'1997-07-01 00:00:00-07:00', '1997-08-01 00:00:00-07:00',
501+
'1997-09-01 00:00:00-07:00', '1997-10-01 00:00:00-07:00',
502+
'1997-11-01 00:00:00-08:00', '1997-12-01 00:00:00-08:00']
503+
],
504+
[datetime.timedelta(days=141),
505+
['1997-01-01 00:00:00-08:00', '1997-01-22 00:00:00-08:00',
506+
'1997-02-01 00:00:00-08:00', '1997-02-22 00:00:00-08:00',
507+
'1997-03-01 00:00:00-08:00', '1997-03-22 00:00:00-08:00',
508+
'1997-04-01 00:00:00-08:00', '1997-04-22 00:00:00-07:00',
509+
'1997-05-01 00:00:00-07:00', '1997-05-22 00:00:00-07:00']
510+
],
511+
[datetime.timedelta(days=40),
512+
['1997-01-01 00:00:00-08:00', '1997-01-05 00:00:00-08:00',
513+
'1997-01-09 00:00:00-08:00', '1997-01-13 00:00:00-08:00',
514+
'1997-01-17 00:00:00-08:00', '1997-01-21 00:00:00-08:00',
515+
'1997-01-25 00:00:00-08:00', '1997-01-29 00:00:00-08:00',
516+
'1997-02-01 00:00:00-08:00', '1997-02-05 00:00:00-08:00',
517+
'1997-02-09 00:00:00-08:00']
518+
],
519+
[datetime.timedelta(hours=40),
520+
['1997-01-01 00:00:00-08:00', '1997-01-01 04:00:00-08:00',
521+
'1997-01-01 08:00:00-08:00', '1997-01-01 12:00:00-08:00',
522+
'1997-01-01 16:00:00-08:00', '1997-01-01 20:00:00-08:00',
523+
'1997-01-02 00:00:00-08:00', '1997-01-02 04:00:00-08:00',
524+
'1997-01-02 08:00:00-08:00', '1997-01-02 12:00:00-08:00',
525+
'1997-01-02 16:00:00-08:00']
526+
],
527+
[datetime.timedelta(minutes=20),
528+
['1997-01-01 00:00:00-08:00', '1997-01-01 00:05:00-08:00',
529+
'1997-01-01 00:10:00-08:00', '1997-01-01 00:15:00-08:00',
530+
'1997-01-01 00:20:00-08:00']
531+
],
532+
[datetime.timedelta(seconds=40),
533+
['1997-01-01 00:00:00-08:00', '1997-01-01 00:00:05-08:00',
534+
'1997-01-01 00:00:10-08:00', '1997-01-01 00:00:15-08:00',
535+
'1997-01-01 00:00:20-08:00', '1997-01-01 00:00:25-08:00',
536+
'1997-01-01 00:00:30-08:00', '1997-01-01 00:00:35-08:00',
537+
'1997-01-01 00:00:40-08:00']
538+
]
539+
)
540+
541+
tz = pytz.timezone('US/Pacific')
542+
d1 = datetime.datetime(1997, 1, 1).astimezone(tz)
543+
for t_delta, expected in results:
544+
d2 = d1 + t_delta
545+
locator = _create_auto_date_locator(d1, d2)
546+
assert list(map(str, mdates.num2date(locator(), tz=tz))) == expected
547+
548+
476549
@image_comparison(baseline_images=['date_inverted_limit'],
477550
extensions=['png'])
478551
def test_date_inverted_limit():

0 commit comments

Comments
 (0)