|
17 | 17 | except ImportError:
|
18 | 18 | import mock
|
19 | 19 | from nose.tools import assert_raises, assert_equal
|
| 20 | +from nose.plugins.skip import SkipTest |
20 | 21 |
|
21 | 22 | from matplotlib.testing.decorators import image_comparison, cleanup
|
22 | 23 | import matplotlib.pyplot as plt
|
@@ -357,6 +358,27 @@ def test_date_inverted_limit():
|
357 | 358 | fig.subplots_adjust(left=0.25)
|
358 | 359 |
|
359 | 360 |
|
| 361 | +def _test_date2num_dst(date_range, tz_convert): |
| 362 | + # Timezones |
| 363 | + BRUSSELS = pytz.timezone('Europe/Brussels') |
| 364 | + UTC = pytz.UTC |
| 365 | + |
| 366 | + # Create a list of timezone-aware datetime objects in UTC |
| 367 | + # Interval is 0b0.0000011 days, to prevent float rounding issues |
| 368 | + dtstart = datetime.datetime(2014, 3, 30, 0, 0, tzinfo=UTC) |
| 369 | + interval = datetime.timedelta(minutes=33, seconds=45) |
| 370 | + interval_days = 0.0234375 # 2025 / 86400 seconds |
| 371 | + N = 8 |
| 372 | + |
| 373 | + dt_utc = date_range(start=dtstart, freq=interval, periods=N) |
| 374 | + dt_bxl = tz_convert(dt_utc, BRUSSELS) |
| 375 | + |
| 376 | + expected_ordinalf = [735322.0 + (i * interval_days) for i in range(N)] |
| 377 | + actual_ordinalf = list(mdates.date2num(dt_bxl)) |
| 378 | + |
| 379 | + assert_equal(actual_ordinalf, expected_ordinalf) |
| 380 | + |
| 381 | + |
360 | 382 | def test_date2num_dst():
|
361 | 383 | # Test for github issue #3896, but in date2num around DST transitions
|
362 | 384 | # with a timezone-aware pandas date_range object.
|
@@ -408,25 +430,31 @@ def mk_tzaware(cls, datetime_obj):
|
408 | 430 |
|
409 | 431 | return cls(**kwargs)
|
410 | 432 |
|
411 |
| - # Timezones |
412 |
| - BRUSSELS = pytz.timezone('Europe/Brussels') |
413 |
| - UTC = pytz.UTC |
| 433 | + # Define a date_range function similar to pandas.date_range |
| 434 | + def date_range(start, freq, periods): |
| 435 | + dtstart = dt_tzaware.mk_tzaware(start) |
414 | 436 |
|
415 |
| - # Create a list of timezone-aware datetime objects in UTC |
416 |
| - # Interval is 0b0.0000011 days, to prevent float rounding issues |
417 |
| - dtstart = dt_tzaware(2014, 3, 30, 0, 0, tzinfo=UTC) |
418 |
| - interval = datetime.timedelta(minutes=33, seconds=45) |
419 |
| - interval_days = 0.0234375 # 2025 / 86400 seconds |
420 |
| - N = 8 |
| 437 | + return [dtstart + (i * freq) for i in range(periods)] |
421 | 438 |
|
422 |
| - dt_utc = [dtstart + i * interval for i in range(N)] |
423 |
| - dt_bxl = [d.astimezone(BRUSSELS) for d in dt_utc] |
| 439 | + # Define a tz_convert function that converts a list to a new time zone. |
| 440 | + def tz_convert(dt_list, tzinfo): |
| 441 | + return [d.astimezone(tzinfo) for d in dt_list] |
424 | 442 |
|
425 |
| - expected_ordinalf = [735322.0 + (i * interval_days) for i in range(N)] |
| 443 | + _test_date2num_dst(date_range, tz_convert) |
426 | 444 |
|
427 |
| - actual_ordinalf = list(mdates.date2num(dt_bxl)) |
428 | 445 |
|
429 |
| - assert_equal(actual_ordinalf, expected_ordinalf) |
| 446 | +def test_date2num_dst_pandas(): |
| 447 | + # Test for github issue #3896, but in date2num around DST transitions |
| 448 | + # with a timezone-aware pandas date_range object. |
| 449 | + try: |
| 450 | + import pandas as pd |
| 451 | + except ImportError: |
| 452 | + raise SkipTest('pandas not installed') |
| 453 | + |
| 454 | + def tz_convert(*args): |
| 455 | + return pd.DatetimeIndex.tz_convert(*args).astype(datetime.datetime) |
| 456 | + |
| 457 | + _test_date2num_dst(pd.date_range, tz_convert) |
430 | 458 |
|
431 | 459 |
|
432 | 460 | if __name__ == '__main__':
|
|
0 commit comments