def cesm_time_from_bnds(xr_data, min_year=1701): """ Use mid-points from time_bnds in CESM output data to populate time dimension with numpy.datetime64 values. Args: xr_data: xarray Dataset containing CESM output data. min_year: integer specifying minimum year to accept for reference date, derived from units. If the reference year is less than min_year, then the reference year will be changed to min_year. This allows dates to be shifted to be greater than e.g. 1678. (default 1701) Returns: Copy of xr_data, with modified time and time_bnds dimensions. """ data = xr_data.copy() try: time_bnds_mid = data['time_bnds'].mean(dim='bnds') except ValueError: try: time_bnds_mid = data['time_bnds'].mean(dim='nb2') except ValueError: time_bnds_mid = data['time_bnds'].mean(dim='nbnd') data['time'].values = climapy.dt_convert_to_datetime64( time_bnds_mid, units=data['time'].units, calendar=data['time'].calendar, min_year=min_year) data['time_bnds'].values = climapy.dt_convert_to_datetime64( data['time_bnds'], units=data['time'].units, calendar=data['time'].calendar, min_year=min_year) return data
def test_365_day_with_float(self): result = climapy.dt_convert_to_datetime64( 365. * 1970 + 1.5, units='days since 1-1-1 00:00:00', calendar='365_day') correct = np.datetime64('1971-01-02T12:00:00') assert result == correct
def test_365_day_with_array(self): result = climapy.dt_convert_to_datetime64( np.array([3648., 3650., 3652.]), units='days since 2000-01-01 00:00:00', calendar='365_day') correct = np.array(['2009-12-30', '2010-01-01', '2010-01-03'], dtype='datetime64') assert np.array_equal(result, correct)
def test_365_day_with_list(self): result = climapy.dt_convert_to_datetime64( [3648, 3650, 3652], units='days since 1-1-1 00:00:00', calendar='365_day') correct = np.array(['0010-12-30', '0011-01-01', '0011-01-03'], dtype='datetime64') assert np.array_equal(result, correct)
def test_gregorian_with_int(self): result = climapy.dt_convert_to_datetime64( 365 * 10 + 2, units='days since 1-1-1 00:00:00', calendar='gregorian') correct = np.datetime64( '0011-01-01T00:00:00') # two leap years in period assert result == correct
def test_min_year(self): result = climapy.dt_convert_to_datetime64( [3648, 3650, 3652], units='days since 1-1-1 00:00:00', calendar='365_day', min_year=1701) correct = np.array(['1710-12-30', '1711-01-01', '1711-01-03'], dtype='datetime64') assert np.array_equal(result, correct)
def test_365_day_with_int(self): result = climapy.dt_convert_to_datetime64( 365 * 10, units='days since 1-1-1 00:00:00', calendar='365_day') correct = np.datetime64('0011-01-01') assert result == correct
def test_invalid_min_year(self): with pytest.raises(ValueError): climapy.dt_convert_to_datetime64(1, min_year=1971.) # float not int
def test_invalid_data_two(self): with pytest.raises(ValueError): climapy.dt_convert_to_datetime64(-1)
def test_invalid_data_one(self): with pytest.raises(ValueError): climapy.dt_convert_to_datetime64('string')
def test_invalid_units_three(self): with pytest.raises(ValueError): climapy.dt_convert_to_datetime64(1, units='days since the start')
def test_invalid_units_two(self): with pytest.raises(ValueError): climapy.dt_convert_to_datetime64(1, units='eons since 1-1-1 0:0:0')
def test_invalid_units_one(self): with pytest.raises(ValueError): climapy.dt_convert_to_datetime64(1, units='my_calendar')