예제 #1
0
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
예제 #2
0
 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
예제 #3
0
 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)
예제 #4
0
 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)
예제 #5
0
 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
예제 #6
0
 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)
예제 #7
0
 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
예제 #8
0
 def test_invalid_min_year(self):
     with pytest.raises(ValueError):
         climapy.dt_convert_to_datetime64(1,
                                          min_year=1971.)  # float not int
예제 #9
0
 def test_invalid_data_two(self):
     with pytest.raises(ValueError):
         climapy.dt_convert_to_datetime64(-1)
예제 #10
0
 def test_invalid_data_one(self):
     with pytest.raises(ValueError):
         climapy.dt_convert_to_datetime64('string')
예제 #11
0
 def test_invalid_units_three(self):
     with pytest.raises(ValueError):
         climapy.dt_convert_to_datetime64(1, units='days since the start')
예제 #12
0
 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')
예제 #13
0
 def test_invalid_units_one(self):
     with pytest.raises(ValueError):
         climapy.dt_convert_to_datetime64(1, units='my_calendar')