1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
From bbf9f2be93a1f9105ee93b50fa3f0c841dbc6e71 Mon Sep 17 00:00:00 2001
From: Klaus Zimmermann <klaus_zimmermann@gmx.de>
Date: Fri, 9 Dec 2016 18:15:24 +0100
Subject: netcdftime compatibility
Remove some internal netcdftime functions that are no longer accessible.
Signed-off-by: Klaus Zimmermann <klaus_zimmermann@gmx.de>
---
cf/cfdatetime.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++------
cf/units.py | 6 +++++-
2 files changed, 57 insertions(+), 7 deletions(-)
diff --git a/cf/cfdatetime.py b/cf/cfdatetime.py
index 36819e2..b438362 100644
--- a/cf/cfdatetime.py
+++ b/cf/cfdatetime.py
@@ -14,9 +14,60 @@ from .units import Units
if netCDF4.__version__ <= '1.1.1':
_netCDF4_netcdftime_parse_date = netCDF4.netcdftime._parse_date
_netCDF4_netcdftime_strftime = netCDF4.netcdftime._strftime
-else:
+elif netCDF4.__version__ <= '1.2.4':
_netCDF4_netcdftime_parse_date = netCDF4.netcdftime.netcdftime._parse_date
_netCDF4_netcdftime_strftime = netCDF4.netcdftime._datetime._strftime
+else:
+ import time
+
+ def _findall(text, substr):
+ # Also finds overlaps
+ sites = []
+ i = 0
+ while 1:
+ j = text.find(substr, i)
+ if j == -1:
+ break
+ sites.append(j)
+ i = j + 1
+ return sites
+
+
+ def _netCDF4_netcdftime_strftime(dt, fmt):
+ if _illegal_s.search(fmt):
+ raise TypeError("This strftime implementation does not handle %s")
+ # don't use strftime method at all.
+ # if dt.year > 1900:
+ # return dt.strftime(fmt)
+
+ year = dt.year
+ # For every non-leap year century, advance by
+ # 6 years to get into the 28-year repeat cycle
+ delta = 2000 - year
+ off = 6 * (delta // 100 + delta // 400)
+ year = year + off
+
+ # Move to around the year 2000
+ year = year + ((2000 - year) // 28) * 28
+ timetuple = dt.timetuple()
+ s1 = time.strftime(fmt, (year,) + timetuple[1:])
+ sites1 = _findall(s1, str(year))
+
+ s2 = time.strftime(fmt, (year + 28,) + timetuple[1:])
+ sites2 = _findall(s2, str(year + 28))
+
+ sites = []
+ for site in sites1:
+ if site in sites2:
+ sites.append(site)
+
+ s = s1
+ syear = "%4d" % (dt.year,)
+ for site in sites:
+ s = s[:site] + syear + s[site + 4:]
+ return s
+
+ _netCDF4_netcdftime_parse_date = netCDF4.netcdftime._parse_date
# Define some useful units
@@ -730,11 +781,6 @@ second).
return jd
#--- End: def
-if netCDF4.__version__ <= '1.1.1':
- netCDF4.netcdftime._NoLeapDayFromDate = _NoLeapDayFromDate
-else:
- netCDF4.netcdftime.netcdftime._NoLeapDayFromDate = _NoLeapDayFromDate
-
def interval(value, units_in, units_out=None, dummy1=None):
'''
diff --git a/cf/units.py b/cf/units.py
index ada337c..d35c967 100644
--- a/cf/units.py
+++ b/cf/units.py
@@ -263,10 +263,14 @@ if netCDF4.__version__ <= '1.1.1':
_DateFromNoLeapDay = netCDF4.netcdftime._DateFromNoLeapDay
_DateFromAllLeap = netCDF4.netcdftime._DateFromAllLeap
_DateFrom360Day = netCDF4.netcdftime._DateFrom360Day
-else:
+elif netCDF4.__version__ <= '1.2.4':
_DateFromNoLeapDay = netCDF4.netcdftime.netcdftime._DateFromNoLeapDay
_DateFromAllLeap = netCDF4.netcdftime.netcdftime._DateFromAllLeap
_DateFrom360Day = netCDF4.netcdftime.netcdftime._DateFrom360Day
+else:
+ # In 1.2.5 these functions have been moved to pure cython (cdef)
+ # functions, inaccessible from python.
+ pass
# --------------------------------------------------------------------
# Aliases for netCDF4.netcdftime functions
|