Skip to content

Commit 407e8d8

Browse files
authored
Merge pull request #24224 from oscargus/juliandeprecation
Deprecate Julian date-related functions and constant
2 parents aaa5129 + a76ccca commit 407e8d8

File tree

3 files changed

+33
-19
lines changed

3 files changed

+33
-19
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
``num2julian``, ``julian2num`` and ``JULIAN_OFFSET``
2+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3+
4+
... of the `.dates` module are deprecated without replacements. These are
5+
undocumented and not exported. If you rely on these, please make a local copy.

lib/matplotlib/dates.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,18 @@
202202
UTC = datetime.timezone.utc
203203

204204

205+
@_api.caching_module_getattr
206+
class __getattr__:
207+
JULIAN_OFFSET = _api.deprecated("3.7")(property(lambda self: 1721424.5))
208+
# Julian date at 0000-12-31
209+
# note that the Julian day epoch is achievable w/
210+
# np.datetime64('-4713-11-24T12:00:00'); datetime64 is proleptic
211+
# Gregorian and BC has a one-year offset. So
212+
# np.datetime64('0000-12-31') - np.datetime64('-4713-11-24T12:00') =
213+
# 1721424.5
214+
# Ref: https://en.wikipedia.org/wiki/Julian_day
215+
216+
205217
def _get_tzinfo(tz=None):
206218
"""
207219
Generate tzinfo from a string or return tzinfo. If None,
@@ -225,12 +237,6 @@ def _get_tzinfo(tz=None):
225237
# Time-related constants.
226238
EPOCH_OFFSET = float(datetime.datetime(1970, 1, 1).toordinal())
227239
# EPOCH_OFFSET is not used by matplotlib
228-
JULIAN_OFFSET = 1721424.5 # Julian date at 0000-12-31
229-
# note that the Julian day epoch is achievable w/
230-
# np.datetime64('-4713-11-24T12:00:00'); datetime64 is proleptic
231-
# Gregorian and BC has a one-year offset. So
232-
# np.datetime64('0000-12-31') - np.datetime64('-4713-11-24T12:00') = 1721424.5
233-
# Ref: https://en.wikipedia.org/wiki/Julian_day
234240
MICROSECONDLY = SECONDLY + 1
235241
HOURS_PER_DAY = 24.
236242
MIN_PER_HOUR = 60.
@@ -457,6 +463,7 @@ def date2num(d):
457463
return d if iterable else d[0]
458464

459465

466+
@_api.deprecated("3.7")
460467
def julian2num(j):
461468
"""
462469
Convert a Julian date (or sequence) to a Matplotlib date (or sequence).
@@ -476,10 +483,11 @@ def julian2num(j):
476483
ep0 = np.datetime64('0000-12-31T00:00:00', 'h').astype(float) / 24.
477484
# Julian offset defined above is relative to 0000-12-31, but we need
478485
# relative to our current epoch:
479-
dt = JULIAN_OFFSET - ep0 + ep
486+
dt = __getattr__("JULIAN_OFFSET") - ep0 + ep
480487
return np.subtract(j, dt) # Handles both scalar & nonscalar j.
481488

482489

490+
@_api.deprecated("3.7")
483491
def num2julian(n):
484492
"""
485493
Convert a Matplotlib date (or sequence) to a Julian date (or sequence).
@@ -498,7 +506,7 @@ def num2julian(n):
498506
ep0 = np.datetime64('0000-12-31T00:00:00', 'h').astype(float) / 24.
499507
# Julian offset defined above is relative to 0000-12-31, but we need
500508
# relative to our current epoch:
501-
dt = JULIAN_OFFSET - ep0 + ep
509+
dt = __getattr__("JULIAN_OFFSET") - ep0 + ep
502510
return np.add(n, dt) # Handles both scalar & nonscalar j.
503511

504512

lib/matplotlib/tests/test_dates.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,17 +1241,18 @@ def test_change_interval_multiples():
12411241

12421242

12431243
def test_julian2num():
1244-
mdates._reset_epoch_test_example()
1245-
mdates.set_epoch('0000-12-31')
1246-
# 2440587.5 is julian date for 1970-01-01T00:00:00
1247-
# https://en.wikipedia.org/wiki/Julian_day
1248-
assert mdates.julian2num(2440588.5) == 719164.0
1249-
assert mdates.num2julian(719165.0) == 2440589.5
1250-
# set back to the default
1251-
mdates._reset_epoch_test_example()
1252-
mdates.set_epoch('1970-01-01T00:00:00')
1253-
assert mdates.julian2num(2440588.5) == 1.0
1254-
assert mdates.num2julian(2.0) == 2440589.5
1244+
with pytest.warns(_api.MatplotlibDeprecationWarning):
1245+
mdates._reset_epoch_test_example()
1246+
mdates.set_epoch('0000-12-31')
1247+
# 2440587.5 is julian date for 1970-01-01T00:00:00
1248+
# https://en.wikipedia.org/wiki/Julian_day
1249+
assert mdates.julian2num(2440588.5) == 719164.0
1250+
assert mdates.num2julian(719165.0) == 2440589.5
1251+
# set back to the default
1252+
mdates._reset_epoch_test_example()
1253+
mdates.set_epoch('1970-01-01T00:00:00')
1254+
assert mdates.julian2num(2440588.5) == 1.0
1255+
assert mdates.num2julian(2.0) == 2440589.5
12551256

12561257

12571258
def test_DateLocator():

0 commit comments

Comments
 (0)