|
1 | 1 | import datetime |
2 | 2 | from functools import partial |
3 | 3 |
|
4 | | -import cftime |
5 | 4 | import numpy as np |
6 | 5 |
|
7 | 6 | from .functions import _DEPRECATION_ERROR_CLASS |
|
10 | 9 | default_calendar = "gregorian" |
11 | 10 |
|
12 | 11 | # -------------------------------------------------------------------- |
13 | | -# Mapping of CF calendars to cftime date-time objects |
| 12 | +# Mapping of CF calendars to cftime date-time objects (that gets |
| 13 | +# populated in the `dt` function). |
14 | 14 | # -------------------------------------------------------------------- |
15 | | -_datetime_object = { |
16 | | - ("",): partial(cftime.datetime, calendar=""), |
17 | | - (None, "gregorian", "standard", "none"): cftime.DatetimeGregorian, |
18 | | - ("proleptic_gregorian",): cftime.DatetimeProlepticGregorian, |
19 | | - ("360_day",): cftime.Datetime360Day, |
20 | | - ("noleap", "365_day"): cftime.DatetimeNoLeap, |
21 | | - ("all_leap", "366_day"): cftime.DatetimeAllLeap, |
22 | | - ("julian",): cftime.DatetimeJulian, |
23 | | -} |
| 15 | +_datetime_object = {} |
24 | 16 |
|
25 | 17 | canonical_calendar = { |
26 | 18 | None: "standard", |
|
40 | 32 | _calendar_map = {None: "gregorian"} |
41 | 33 |
|
42 | 34 |
|
43 | | -class Datetime(cftime.datetime): |
| 35 | +class Datetime: |
44 | 36 | """A date-time object which supports CF calendars. |
45 | 37 |
|
46 | 38 | Deprecated at version 3.0.0. Use function 'cf.dt' to create date- |
@@ -134,6 +126,26 @@ def dt( |
134 | 126 | (2003, 4, 5, 12, 30, 15) |
135 | 127 |
|
136 | 128 | """ |
| 129 | + import cftime |
| 130 | + |
| 131 | + if not _datetime_object: |
| 132 | + _datetime_object.update( |
| 133 | + { |
| 134 | + ("",): partial(cftime.datetime, calendar=""), |
| 135 | + ( |
| 136 | + None, |
| 137 | + "gregorian", |
| 138 | + "standard", |
| 139 | + "none", |
| 140 | + ): cftime.DatetimeGregorian, |
| 141 | + ("proleptic_gregorian",): cftime.DatetimeProlepticGregorian, |
| 142 | + ("360_day",): cftime.Datetime360Day, |
| 143 | + ("noleap", "365_day"): cftime.DatetimeNoLeap, |
| 144 | + ("all_leap", "366_day"): cftime.DatetimeAllLeap, |
| 145 | + ("julian",): cftime.DatetimeJulian, |
| 146 | + } |
| 147 | + ) |
| 148 | + |
137 | 149 | if isinstance(arg, str): |
138 | 150 | (year, month, day, hour, minute, second, microsecond) = st2elements( |
139 | 151 | arg |
@@ -161,11 +173,6 @@ def dt( |
161 | 173 | else: |
162 | 174 | year = arg |
163 | 175 |
|
164 | | - # calendar=_calendar_map.get(calendar, calendar) |
165 | | - # |
166 | | - # return cftime.datetime(year, month, day, hour, minute, second, |
167 | | - # microsecond, calendar=calendar) |
168 | | - |
169 | 176 | for calendars, datetime_cls in _datetime_object.items(): |
170 | 177 | if calendar in calendars: |
171 | 178 | return datetime_cls( |
@@ -354,6 +361,8 @@ def st2datetime(date_string, calendar=None): |
354 | 361 | `cftime.datetime` |
355 | 362 |
|
356 | 363 | """ |
| 364 | + import cftime |
| 365 | + |
357 | 366 | if date_string.count("-") != 2: |
358 | 367 | raise ValueError( |
359 | 368 | "Input date-time string must contain at least a year, a month " |
@@ -388,6 +397,8 @@ def st2elements(date_string): |
388 | 397 | `tuple` |
389 | 398 |
|
390 | 399 | """ |
| 400 | + import cftime |
| 401 | + |
391 | 402 | if date_string.count("-") != 2: |
392 | 403 | raise ValueError( |
393 | 404 | "Input date-time string must contain at least a year, a month " |
@@ -450,6 +461,8 @@ def rt2dt(array, units_in, units_out=None, dummy1=None): |
450 | 461 | # mask |
451 | 462 | return np.ma.masked_all((), dtype=object) |
452 | 463 |
|
| 464 | + import cftime |
| 465 | + |
453 | 466 | units = units_in.units |
454 | 467 | calendar = getattr(units_in, "calendar", "standard") |
455 | 468 |
|
@@ -510,6 +523,8 @@ def dt2rt(array, units_in, units_out, dummy1=None): |
510 | 523 | [-- 685.5] |
511 | 524 |
|
512 | 525 | """ |
| 526 | + import cftime |
| 527 | + |
513 | 528 | isscalar = not np.ndim(array) |
514 | 529 |
|
515 | 530 | array = cftime.date2num( |
@@ -545,8 +560,9 @@ def st2rt(array, units_in, units_out, dummy1=None): |
545 | 560 | An array of floats with the same shape as *array*. |
546 | 561 |
|
547 | 562 | """ |
| 563 | + import cftime |
| 564 | + |
548 | 565 | array = st2dt(array, units_in) |
549 | | - # array = units_out._utime.date2num(array) |
550 | 566 | array = cftime.date2num( |
551 | 567 | array, units=units_out.units, calendar=units_out._utime.calendar |
552 | 568 | ) |
|
0 commit comments