8
8
import pandas as pd
9
9
10
10
from xarray import Variable , coding
11
+ from xarray .coding .times import _import_netcdftime
11
12
from . import (
12
- TestCase , requires_netCDF4 , assert_array_equal )
13
+ TestCase , requires_netcdftime , assert_array_equal )
13
14
import pytest
14
15
15
16
@@ -22,9 +23,9 @@ def _ensure_naive_tz(dt):
22
23
23
24
24
25
class TestDatetime (TestCase ):
25
- @requires_netCDF4
26
+ @requires_netcdftime
26
27
def test_cf_datetime (self ):
27
- import netCDF4 as nc4
28
+ nctime = _import_netcdftime ()
28
29
for num_dates , units in [
29
30
(np .arange (10 ), 'days since 2000-01-01' ),
30
31
(np .arange (10 ).astype ('float64' ), 'days since 2000-01-01' ),
@@ -53,7 +54,7 @@ def test_cf_datetime(self):
53
54
]:
54
55
for calendar in ['standard' , 'gregorian' , 'proleptic_gregorian' ]:
55
56
expected = _ensure_naive_tz (
56
- nc4 .num2date (num_dates , units , calendar ))
57
+ nctime .num2date (num_dates , units , calendar ))
57
58
print (num_dates , units , calendar )
58
59
with warnings .catch_warnings ():
59
60
warnings .filterwarnings ('ignore' ,
@@ -88,7 +89,7 @@ def test_cf_datetime(self):
88
89
pd .Index (actual ), units , calendar )
89
90
assert_array_equal (num_dates , np .around (encoded , 1 ))
90
91
91
- @requires_netCDF4
92
+ @requires_netcdftime
92
93
def test_decode_cf_datetime_overflow (self ):
93
94
# checks for
94
95
# https://github.com/pydata/pandas/issues/14068
@@ -113,7 +114,7 @@ def test_decode_cf_datetime_non_standard_units(self):
113
114
actual = coding .times .decode_cf_datetime (np .arange (100 ), units )
114
115
assert_array_equal (actual , expected )
115
116
116
- @requires_netCDF4
117
+ @requires_netcdftime
117
118
def test_decode_cf_datetime_non_iso_strings (self ):
118
119
# datetime strings that are _almost_ ISO compliant but not quite,
119
120
# but which netCDF4.num2date can still parse correctly
@@ -125,17 +126,17 @@ def test_decode_cf_datetime_non_iso_strings(self):
125
126
actual = coding .times .decode_cf_datetime (num_dates , units )
126
127
assert_array_equal (actual , expected )
127
128
128
- @requires_netCDF4
129
+ @requires_netcdftime
129
130
def test_decode_non_standard_calendar (self ):
130
- import netCDF4 as nc4
131
+ nctime = _import_netcdftime ()
131
132
132
133
for calendar in ['noleap' , '365_day' , '360_day' , 'julian' , 'all_leap' ,
133
134
'366_day' ]:
134
135
units = 'days since 0001-01-01'
135
136
times = pd .date_range ('2001-04-01-00' , end = '2001-04-30-23' ,
136
137
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 )
139
140
expected = times .values
140
141
with warnings .catch_warnings ():
141
142
warnings .filterwarnings ('ignore' , 'Unable to decode time axis' )
@@ -148,7 +149,7 @@ def test_decode_non_standard_calendar(self):
148
149
# https://github.com/Unidata/netcdf4-python/issues/355
149
150
assert (abs_diff <= np .timedelta64 (1 , 's' )).all ()
150
151
151
- @requires_netCDF4
152
+ @requires_netcdftime
152
153
def test_decode_non_standard_calendar_single_element (self ):
153
154
units = 'days since 0001-01-01'
154
155
for calendar in ['noleap' , '365_day' , '360_day' , 'julian' , 'all_leap' ,
@@ -161,34 +162,37 @@ def test_decode_non_standard_calendar_single_element(self):
161
162
calendar = calendar )
162
163
assert actual .dtype == np .dtype ('M8[ns]' )
163
164
164
- @requires_netCDF4
165
+ @requires_netcdftime
165
166
def test_decode_non_standard_calendar_single_element_fallback (self ):
166
- import netCDF4 as nc4
167
+ nctime = _import_netcdftime ()
167
168
168
169
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 )
170
175
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 )
172
177
with pytest .warns (Warning , match = 'Unable to decode time axis' ):
173
178
actual = coding .times .decode_cf_datetime (num_time , units ,
174
179
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 ))
177
181
assert actual .dtype == np .dtype ('O' )
178
182
assert expected == actual
179
183
180
- @requires_netCDF4
184
+ @requires_netcdftime
181
185
def test_decode_non_standard_calendar_multidim_time (self ):
182
- import netCDF4 as nc4
186
+ nctime = _import_netcdftime ()
183
187
184
188
calendar = 'noleap'
185
189
units = 'days since 0001-01-01'
186
190
times1 = pd .date_range ('2001-04-01' , end = '2001-04-05' , freq = 'D' )
187
191
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 )
192
196
mdim_time = np .empty ((len (noleap_time1 ), 2 ), )
193
197
mdim_time [:, 0 ] = noleap_time1
194
198
mdim_time [:, 1 ] = noleap_time2
@@ -203,16 +207,16 @@ def test_decode_non_standard_calendar_multidim_time(self):
203
207
assert_array_equal (actual [:, 0 ], expected1 )
204
208
assert_array_equal (actual [:, 1 ], expected2 )
205
209
206
- @requires_netCDF4
210
+ @requires_netcdftime
207
211
def test_decode_non_standard_calendar_fallback (self ):
208
- import netCDF4 as nc4
212
+ nctime = _import_netcdftime ()
209
213
# ensure leap year doesn't matter
210
214
for year in [2010 , 2011 , 2012 , 2013 , 2014 ]:
211
215
for calendar in ['360_day' , '366_day' , 'all_leap' ]:
212
216
calendar = '360_day'
213
217
units = 'days since {0}-01-01' .format (year )
214
218
num_times = np .arange (100 )
215
- expected = nc4 .num2date (num_times , units , calendar )
219
+ expected = nctime .num2date (num_times , units , calendar )
216
220
217
221
with warnings .catch_warnings (record = True ) as w :
218
222
warnings .simplefilter ('always' )
@@ -225,7 +229,7 @@ def test_decode_non_standard_calendar_fallback(self):
225
229
assert actual .dtype == np .dtype ('O' )
226
230
assert_array_equal (actual , expected )
227
231
228
- @requires_netCDF4
232
+ @requires_netcdftime
229
233
def test_cf_datetime_nan (self ):
230
234
for num_dates , units , expected_list in [
231
235
([np .nan ], 'days since 2000-01-01' , ['NaT' ]),
@@ -240,7 +244,7 @@ def test_cf_datetime_nan(self):
240
244
expected = np .array (expected_list , dtype = 'datetime64[ns]' )
241
245
assert_array_equal (expected , actual )
242
246
243
- @requires_netCDF4
247
+ @requires_netcdftime
244
248
def test_decoded_cf_datetime_array_2d (self ):
245
249
# regression test for GH1229
246
250
variable = Variable (('x' , 'y' ), np .array ([[0 , 1 ], [2 , 3 ]]),
0 commit comments