@@ -44,9 +44,9 @@ def test_date_numpyx():
4444 [datetime .datetime (2017 , 1 , 1 , 2 , 1 , 1 ),
4545 datetime .datetime (2017 , 1 , 1 , 3 , 1 , 1 )]]])
4646@pytest .mark .parametrize ('dtype' , ['datetime64[s]' ,
47- 'datetime64[us]' ,
48- 'datetime64[ms]' ,
49- 'datetime64[ns]' ])
47+ 'datetime64[us]' ,
48+ 'datetime64[ms]' ,
49+ 'datetime64[ns]' ])
5050def test_date_date2num_numpy (t0 , dtype ):
5151 time = mdates .date2num (t0 )
5252 tnp = np .array (t0 , dtype = dtype )
@@ -55,9 +55,9 @@ def test_date_date2num_numpy(t0, dtype):
5555
5656
5757@pytest .mark .parametrize ('dtype' , ['datetime64[s]' ,
58- 'datetime64[us]' ,
59- 'datetime64[ms]' ,
60- 'datetime64[ns]' ])
58+ 'datetime64[us]' ,
59+ 'datetime64[ms]' ,
60+ 'datetime64[ns]' ])
6161def test_date2num_NaT (dtype ):
6262 t0 = datetime .datetime (2017 , 1 , 1 , 0 , 1 , 1 )
6363 tmpl = [mdates .date2num (t0 ), np .nan ]
@@ -481,7 +481,7 @@ def _create_auto_date_locator(date1, date2):
481481 ],
482482 [datetime .timedelta (weeks = 52 ),
483483 ['1997' , 'Feb' , 'Mar' , 'Apr' , 'May' , 'Jun' , 'Jul' , 'Aug' ,
484- 'Sep' , 'Oct' , 'Nov' , 'Dec' ]
484+ 'Sep' , 'Oct' , 'Nov' , 'Dec' ]
485485 ],
486486 [datetime .timedelta (days = 141 ),
487487 ['Jan' , '22' , 'Feb' , '22' , 'Mar' , '22' , 'Apr' , '22' ,
@@ -511,6 +511,117 @@ def _create_auto_date_locator(date1, date2):
511511 assert strings == expected
512512
513513
514+ def test_concise_formatter_formats ():
515+ formats = ['%Y' , '%m/%Y' , 'day: %d' ,
516+ '%H hr %M min' , '%H hr %M min' , '%S.%f sec' ]
517+
518+ def _create_auto_date_locator (date1 , date2 ):
519+ fig , ax = plt .subplots ()
520+
521+ locator = mdates .AutoDateLocator (interval_multiples = True )
522+ formatter = mdates .ConciseDateFormatter (locator , formats = formats )
523+ ax .yaxis .set_major_locator (locator )
524+ ax .yaxis .set_major_formatter (formatter )
525+ ax .set_ylim (date1 , date2 )
526+ fig .canvas .draw ()
527+ sts = []
528+ for st in ax .get_yticklabels ():
529+ sts += [st .get_text ()]
530+ return sts
531+
532+ d1 = datetime .datetime (1997 , 1 , 1 )
533+ results = ([datetime .timedelta (weeks = 52 * 200 ),
534+ [str (t ) for t in range (1980 , 2201 , 20 )]
535+ ],
536+ [datetime .timedelta (weeks = 52 ),
537+ ['1997' , '02/1997' , '03/1997' , '04/1997' , '05/1997' , '06/1997' ,
538+ '07/1997' , '08/1997' , '09/1997' , '10/1997' , '11/1997' , '12/1997' ]
539+ ],
540+ [datetime .timedelta (days = 141 ),
541+ ['01/1997' , 'day: 22' , '02/1997' , 'day: 22' , '03/1997' ,
542+ 'day: 22' , '04/1997' , 'day: 22' , '05/1997' , 'day: 22' ]
543+ ],
544+ [datetime .timedelta (days = 40 ),
545+ ['01/1997' , 'day: 05' , 'day: 09' , 'day: 13' , 'day: 17' , 'day: 21' ,
546+ 'day: 25' , 'day: 29' , '02/1997' , 'day: 05' , 'day: 09' ]
547+ ],
548+ [datetime .timedelta (hours = 40 ),
549+ ['day: 01' ,
550+ '04 hr 00 min' , '08 hr 00 min' , '12 hr 00 min' , '16 hr 00 min' , '20 hr 00 min' , 'day: 02' ,
551+ '04 hr 00 min' , '08 hr 00 min' , '12 hr 00 min' , '16 hr 00 min' ]
552+ ],
553+ [datetime .timedelta (minutes = 20 ),
554+ ['00 hr 00 min' , '00 hr 05 min' , '00 hr 10 min' ,
555+ '00 hr 15 min' , '00 hr 20 min' ]
556+ ],
557+ [datetime .timedelta (seconds = 40 ),
558+ ['00 hr 00 min' , '05.000000 sec' , '10.000000 sec' , '15.000000 sec' , '20.000000 sec' ,
559+ '25.000000 sec' , '30.000000 sec' , '35.000000 sec' , '40.000000 sec' ]
560+ ],
561+ [datetime .timedelta (seconds = 2 ),
562+ ['59.500000 sec' , '00 hr 00 min' , '00.500000 sec' , '01.000000 sec' ,
563+ '01.500000 sec' , '02.000000 sec' , '02.500000 sec' ]
564+ ],
565+ )
566+ for t_delta , expected in results :
567+ d2 = d1 + t_delta
568+ strings = _create_auto_date_locator (d1 , d2 )
569+ assert strings == expected
570+
571+
572+ def test_concise_formatter_zformats ():
573+ zero_formats = ['' , '%Y' , '%b' , '%b-%d' , '%H:%M' , '%H:%M' ]
574+
575+ def _create_auto_date_locator (date1 , date2 ):
576+ fig , ax = plt .subplots ()
577+
578+ locator = mdates .AutoDateLocator (interval_multiples = True )
579+ formatter = mdates .ConciseDateFormatter (locator , zero_formats )
580+ ax .yaxis .set_major_locator (locator )
581+ ax .yaxis .set_major_formatter (formatter )
582+ ax .set_ylim (date1 , date2 )
583+ fig .canvas .draw ()
584+ sts = []
585+ for st in ax .get_yticklabels ():
586+ sts += [st .get_text ()]
587+ return sts
588+
589+ d1 = datetime .datetime (1997 , 1 , 1 )
590+ results = ([datetime .timedelta (weeks = 52 * 200 ),
591+ [str (t ) for t in range (1980 , 2201 , 20 )]
592+ ],
593+ [datetime .timedelta (weeks = 52 ),
594+ ["'97" , 'Feb' , 'Mar' , 'Apr' , 'May' , 'Jun' ,
595+ 'Jul' , 'Aug' , 'Sep' , 'Oct' , 'Nov' , 'Dec' ]
596+ ],
597+ [datetime .timedelta (days = 141 ),
598+ ['January' , '22' , 'February' , '22' , 'March' ,
599+ '22' , 'April' , '22' , 'May' , '22' ]
600+ ],
601+ [datetime .timedelta (days = 40 ),
602+ ['January' , '05' , '09' , '13' , '17' , '21' ,
603+ '25' , '29' , 'February' , '05' , '09' ]
604+ ],
605+ [datetime .timedelta (hours = 40 ),
606+ ['01-01' , '04:00' , '08:00' , '12:00' , '16:00' , '20:00' ,
607+ '01-02' , '04:00' , '08:00' , '12:00' , '16:00' ]
608+ ],
609+ [datetime .timedelta (minutes = 20 ),
610+ ['00' , '00:05' , '00:10' , '00:15' , '00:20' ]
611+ ],
612+ [datetime .timedelta (seconds = 40 ),
613+ ['' , '05' , '10' , '15' , '20' , '25' , '30' , '35' , '40' ]
614+ ],
615+ [datetime .timedelta (seconds = 2 ),
616+ ['59.5' , '.0' , '00.5' , '01.0' , '01.5' , '02.0' , '02.5' ]
617+ ],
618+ )
619+ for t_delta , expected in results :
620+ d2 = d1 + t_delta
621+ strings = _create_auto_date_locator (d1 , d2 )
622+ assert strings == expected
623+
624+
514625def test_concise_formatter_tz ():
515626 def _create_auto_date_locator (date1 , date2 , tz ):
516627 fig , ax = plt .subplots ()
@@ -671,6 +782,7 @@ class dt_tzaware(datetime.datetime):
671782 datetime-like object that applies timezone normalization after
672783 subtraction.
673784 """
785+
674786 def __sub__ (self , other ):
675787 r = super ().__sub__ (other )
676788 tzinfo = getattr (r , 'tzinfo' , None )
@@ -773,7 +885,7 @@ def test_yearlocator_pytz():
773885
774886 tz = pytz .timezone ('America/New_York' )
775887 x = [tz .localize (datetime .datetime (2010 , 1 , 1 ))
776- + datetime .timedelta (i ) for i in range (2000 )]
888+ + datetime .timedelta (i ) for i in range (2000 )]
777889 locator = mdates .AutoDateLocator (interval_multiples = True , tz = tz )
778890 locator .create_dummy_axis ()
779891 locator .set_view_interval (mdates .date2num (x [0 ])- 1.0 ,
0 commit comments