code: def ts(self, data, lon_cyclic=True, lon_str=LON_STR, lat_str=LAT_STR,
             land_mask_str=LAND_MASK_STR, sfc_area_str=SFC_AREA_STR):
          
          data_masked = self.mask_var(data, lon_cyclic=lon_cyclic,
                                      lon_str=lon_str, lat_str=lat_str)
          sfc_area = data[sfc_area_str]
          sfc_area_masked = self.mask_var(sfc_area, lon_cyclic=lon_cyclic,
                                          lon_str=lon_str, lat_str=lat_str)
          land_mask = _get_land_mask(data, self.do_land_mask,
                                     land_mask_str=land_mask_str)
          weights = sfc_area_masked * land_mask
          # Mask weights where data values are initially invalid in addition
          # to applying the region mask.
          weights = weights.where(np.isfinite(data))
          weights_reg_sum = weights.sum(lon_str).sum(lat_str)
          data_reg_sum = (data_masked * sfc_area_masked *
                          land_mask).sum(lat_str).sum(lon_str)
          return data_reg_sum / weights_reg_sum
docs: Create yearly time-series of region-averaged data.
  
          Parameters
          ----------
          data : xarray.DataArray
              The array to create the regional timeseries of
          lon_cyclic : { None, True, False }, optional (default True)
              Whether or not the longitudes of ``data`` span the whole globe,
              meaning that they should be wrapped around as necessary to cover
              the Region's full width.
          lat_str, lon_str, land_mask_str, sfc_area_str : str, optional
              The name of the latitude, longitude, land mask, and surface area
              coordinates, respectively, in ``data``.  Defaults are the
              corresponding values in ``aospy.internal_names``.
  
          Returns
          -------
          xarray.DataArray
              The timeseries of values averaged within the region and within each
              year, one value per year.