Skip to content

Commit 697cc74

Browse files
spencerkclarkJoe Hamman
authored and
Joe Hamman
committed
Use requires_netcdftime decorators in test_coding_times.py (#1929)
* Switch requires_netCDF4 decorators to requires_netcdftime decorators in test_coding_times.py * Fix 'netcdftime' has no attribute 'netcdftime' error
1 parent 97f5778 commit 697cc74

File tree

1 file changed

+32
-28
lines changed

1 file changed

+32
-28
lines changed

xarray/tests/test_coding_times.py

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
import pandas as pd
99

1010
from xarray import Variable, coding
11+
from xarray.coding.times import _import_netcdftime
1112
from . import (
12-
TestCase, requires_netCDF4, assert_array_equal)
13+
TestCase, requires_netcdftime, assert_array_equal)
1314
import pytest
1415

1516

@@ -22,9 +23,9 @@ def _ensure_naive_tz(dt):
2223

2324

2425
class TestDatetime(TestCase):
25-
@requires_netCDF4
26+
@requires_netcdftime
2627
def test_cf_datetime(self):
27-
import netCDF4 as nc4
28+
nctime = _import_netcdftime()
2829
for num_dates, units in [
2930
(np.arange(10), 'days since 2000-01-01'),
3031
(np.arange(10).astype('float64'), 'days since 2000-01-01'),
@@ -53,7 +54,7 @@ def test_cf_datetime(self):
5354
]:
5455
for calendar in ['standard', 'gregorian', 'proleptic_gregorian']:
5556
expected = _ensure_naive_tz(
56-
nc4.num2date(num_dates, units, calendar))
57+
nctime.num2date(num_dates, units, calendar))
5758
print(num_dates, units, calendar)
5859
with warnings.catch_warnings():
5960
warnings.filterwarnings('ignore',
@@ -88,7 +89,7 @@ def test_cf_datetime(self):
8889
pd.Index(actual), units, calendar)
8990
assert_array_equal(num_dates, np.around(encoded, 1))
9091

91-
@requires_netCDF4
92+
@requires_netcdftime
9293
def test_decode_cf_datetime_overflow(self):
9394
# checks for
9495
# https://github.com/pydata/pandas/issues/14068
@@ -113,7 +114,7 @@ def test_decode_cf_datetime_non_standard_units(self):
113114
actual = coding.times.decode_cf_datetime(np.arange(100), units)
114115
assert_array_equal(actual, expected)
115116

116-
@requires_netCDF4
117+
@requires_netcdftime
117118
def test_decode_cf_datetime_non_iso_strings(self):
118119
# datetime strings that are _almost_ ISO compliant but not quite,
119120
# but which netCDF4.num2date can still parse correctly
@@ -125,17 +126,17 @@ def test_decode_cf_datetime_non_iso_strings(self):
125126
actual = coding.times.decode_cf_datetime(num_dates, units)
126127
assert_array_equal(actual, expected)
127128

128-
@requires_netCDF4
129+
@requires_netcdftime
129130
def test_decode_non_standard_calendar(self):
130-
import netCDF4 as nc4
131+
nctime = _import_netcdftime()
131132

132133
for calendar in ['noleap', '365_day', '360_day', 'julian', 'all_leap',
133134
'366_day']:
134135
units = 'days since 0001-01-01'
135136
times = pd.date_range('2001-04-01-00', end='2001-04-30-23',
136137
freq='H')
137-
noleap_time = nc4.date2num(times.to_pydatetime(), units,
138-
calendar=calendar)
138+
noleap_time = nctime.date2num(times.to_pydatetime(), units,
139+
calendar=calendar)
139140
expected = times.values
140141
with warnings.catch_warnings():
141142
warnings.filterwarnings('ignore', 'Unable to decode time axis')
@@ -148,7 +149,7 @@ def test_decode_non_standard_calendar(self):
148149
# https://github.com/Unidata/netcdf4-python/issues/355
149150
assert (abs_diff <= np.timedelta64(1, 's')).all()
150151

151-
@requires_netCDF4
152+
@requires_netcdftime
152153
def test_decode_non_standard_calendar_single_element(self):
153154
units = 'days since 0001-01-01'
154155
for calendar in ['noleap', '365_day', '360_day', 'julian', 'all_leap',
@@ -161,34 +162,37 @@ def test_decode_non_standard_calendar_single_element(self):
161162
calendar=calendar)
162163
assert actual.dtype == np.dtype('M8[ns]')
163164

164-
@requires_netCDF4
165+
@requires_netcdftime
165166
def test_decode_non_standard_calendar_single_element_fallback(self):
166-
import netCDF4 as nc4
167+
nctime = _import_netcdftime()
167168

168169
units = 'days since 0001-01-01'
169-
dt = nc4.netcdftime.datetime(2001, 2, 29)
170+
try:
171+
dt = nctime.netcdftime.datetime(2001, 2, 29)
172+
except AttributeError:
173+
# Must be using standalone netcdftime library
174+
dt = nctime.datetime(2001, 2, 29)
170175
for calendar in ['360_day', 'all_leap', '366_day']:
171-
num_time = nc4.date2num(dt, units, calendar)
176+
num_time = nctime.date2num(dt, units, calendar)
172177
with pytest.warns(Warning, match='Unable to decode time axis'):
173178
actual = coding.times.decode_cf_datetime(num_time, units,
174179
calendar=calendar)
175-
expected = np.asarray(nc4.num2date(num_time, units, calendar))
176-
print(num_time, calendar, actual, expected)
180+
expected = np.asarray(nctime.num2date(num_time, units, calendar))
177181
assert actual.dtype == np.dtype('O')
178182
assert expected == actual
179183

180-
@requires_netCDF4
184+
@requires_netcdftime
181185
def test_decode_non_standard_calendar_multidim_time(self):
182-
import netCDF4 as nc4
186+
nctime = _import_netcdftime()
183187

184188
calendar = 'noleap'
185189
units = 'days since 0001-01-01'
186190
times1 = pd.date_range('2001-04-01', end='2001-04-05', freq='D')
187191
times2 = pd.date_range('2001-05-01', end='2001-05-05', freq='D')
188-
noleap_time1 = nc4.date2num(times1.to_pydatetime(), units,
189-
calendar=calendar)
190-
noleap_time2 = nc4.date2num(times2.to_pydatetime(), units,
191-
calendar=calendar)
192+
noleap_time1 = nctime.date2num(times1.to_pydatetime(), units,
193+
calendar=calendar)
194+
noleap_time2 = nctime.date2num(times2.to_pydatetime(), units,
195+
calendar=calendar)
192196
mdim_time = np.empty((len(noleap_time1), 2), )
193197
mdim_time[:, 0] = noleap_time1
194198
mdim_time[:, 1] = noleap_time2
@@ -203,16 +207,16 @@ def test_decode_non_standard_calendar_multidim_time(self):
203207
assert_array_equal(actual[:, 0], expected1)
204208
assert_array_equal(actual[:, 1], expected2)
205209

206-
@requires_netCDF4
210+
@requires_netcdftime
207211
def test_decode_non_standard_calendar_fallback(self):
208-
import netCDF4 as nc4
212+
nctime = _import_netcdftime()
209213
# ensure leap year doesn't matter
210214
for year in [2010, 2011, 2012, 2013, 2014]:
211215
for calendar in ['360_day', '366_day', 'all_leap']:
212216
calendar = '360_day'
213217
units = 'days since {0}-01-01'.format(year)
214218
num_times = np.arange(100)
215-
expected = nc4.num2date(num_times, units, calendar)
219+
expected = nctime.num2date(num_times, units, calendar)
216220

217221
with warnings.catch_warnings(record=True) as w:
218222
warnings.simplefilter('always')
@@ -225,7 +229,7 @@ def test_decode_non_standard_calendar_fallback(self):
225229
assert actual.dtype == np.dtype('O')
226230
assert_array_equal(actual, expected)
227231

228-
@requires_netCDF4
232+
@requires_netcdftime
229233
def test_cf_datetime_nan(self):
230234
for num_dates, units, expected_list in [
231235
([np.nan], 'days since 2000-01-01', ['NaT']),
@@ -240,7 +244,7 @@ def test_cf_datetime_nan(self):
240244
expected = np.array(expected_list, dtype='datetime64[ns]')
241245
assert_array_equal(expected, actual)
242246

243-
@requires_netCDF4
247+
@requires_netcdftime
244248
def test_decoded_cf_datetime_array_2d(self):
245249
# regression test for GH1229
246250
variable = Variable(('x', 'y'), np.array([[0, 1], [2, 3]]),

0 commit comments

Comments
 (0)