Help dowloading data (outdated)

20 views
Skip to first unread message

Lara Raffetti Ballerini

unread,
Feb 4, 2026, 7:57:52 AM (9 days ago) Feb 4
to HYCOM.org Forum
Dear HYCOM group,
I am currently working with a iceberg drift forecast model that requires water temperature data, as well as u and v current components. The version of the model I am using has not been updated in several years, and I suspect the data acquisition scripts are now outdated 
I am still getting familiar with model data infrastructure, so I would appreciate any guidance on the best way to update these downloads.  


Dataset: ESPC_D_V02: Global 1/12ª Analysis
3 hourly: t3z water_temp ; u3z water_u ; v3z water_v 
This model is used for the Antarctic region and, for instance, requires data for the current day plus a three-day forecast.

Here is the code:


        if model == "noaa_hycom_global":
            log.info("Loading in current data from noaa_hycom_global")

            dimensions[1] = dimensions[1] % 360
            dimensions[3] = dimensions[3] % 360

            dataset_datetime = start_date - datetime.timedelta(days=1)
            url_date = "{0}-{1}-{2}".format(str(dataset_datetime.year), str(
                dataset_datetime.month).zfill(2), str(dataset_datetime.day).zfill(2))

            hycom_t_url = config.HYCOM_T_URL + url_date + "T12:00:00Z"
            hycom_u_url = config.HYCOM_U_URL + url_date + "T12:00:00Z"
            hycom_v_url = config.HYCOM_V_URL + url_date + "T12:00:00Z"

            try:
                time_dataset = xr.open_dataset(hycom_t_url, decode_times=False).time
            except OSError as e:
                log.exception(e)
                exit(f"Error: No se encontró el dataset para la fecha {url_date}. HYCOM puede estar actualizándose.")

            # start date/time of the downloaded sets
            dataset_start_time = datetime.datetime.strptime(time_dataset.time.units[12:-8], "%Y-%m-%d %H:%M:%S")

            # time index positions
            time_index = [(start_date - dataset_start_time).days * 24 + (
                            start_date - dataset_start_time).seconds / 3600,
                        (end_date - dataset_start_time).days * 24 + (end_date - dataset_start_time).seconds / 3600]

            depths = []
            for i in range(0, int(layers * layer_depth), int(layer_depth)):
                depths.append(float(i))
            
            try:
                u_dataset = xr.open_dataset(hycom_u_url, decode_cf=False).water_u.sel(
                    lat=slice(dimensions[0], dimensions[2]),
                    lon=slice(dimensions[1], dimensions[3]),
                    time=slice(time_index[0], time_index[1]),
                    depth=slice(0, layers * layer_depth)).chunk({'time': 5})
            except ValueError:
                u_dataset = xr.open_dataset(hycom_u_url, decode_cf=False).water_u.sel(
                    lat=slice(dimensions[0], dimensions[2]),
                    lon=slice(dimensions[1], dimensions[3]),
                    time2=slice(time_index[0], time_index[1]),
                    depth=slice(0, layers * layer_depth)).chunk({'time2': 5})

            try:
                v_dataset = xr.open_dataset(hycom_v_url, decode_cf=False).water_v.sel(
                    lat=slice(dimensions[0], dimensions[2]),
                    lon=slice(dimensions[1], dimensions[3]),
                    time=slice(time_index[0], time_index[1]),
                    depth=slice(0, layers * layer_depth)).chunk({'time': 5})
            except ValueError:
                v_dataset = xr.open_dataset(hycom_v_url, decode_cf=False).water_v.sel(
                    lat=slice(dimensions[0], dimensions[2]),
                    lon=slice(dimensions[1], dimensions[3]),
                    time2=slice(time_index[0], time_index[1]),
                    depth=slice(0, layers * layer_depth)).chunk({'time2': 5})


            try:
                t_dataset = xr.open_dataset(hycom_t_url, decode_cf=False).water_temp.sel(
                    lat=slice(dimensions[0], dimensions[2]),
                    lon=slice(dimensions[1], dimensions[3]),
                    time=slice(time_index[0], time_index[1]),
                    depth=slice(0)).chunk({'time': 5})
            except ValueError:
                t_dataset = xr.open_dataset(hycom_t_url, decode_cf=False).water_temp.sel(
                    lat=slice(dimensions[0], dimensions[2]),
                    lon=slice(dimensions[1], dimensions[3]),
                    time2=slice(time_index[0], time_index[1]),
                    depth=slice(0)).chunk({'time2': 5})

            try:
                self.CurrentSpeedData = xr.merge([u_dataset, v_dataset]).interp(depth=depths)
            except Exception as e:
                log.exception(e)
                exit("Error en la interpolación o descarga de datos OPeNDAP.")

            self.TemperatureData = t_dataset.to_dataset().squeeze("depth")

            self.CurrentSpeedData = self.CurrentSpeedData.rename(
                ({"lat": "latitude", "lon": "longitude",
                  "water_u": "current_u", "water_v": "current_v"}))
            self.TemperatureData = self.TemperatureData.rename(
                ({"lat": "latitude", "lon": "longitude",
                  "water_temp": "water_surface_temperature"}))

            self.CurrentSpeedData = remove_duplicates(self.CurrentSpeedData)
            self.TemperatureData = remove_duplicates(self.TemperatureData)
           
            # Convert values within lon and time to be compatible with the rest of the program
            for i in range(0, len(self.CurrentSpeedData.longitude.values), 1):
                self.CurrentSpeedData.longitude.values[i] = \
                    ((self.CurrentSpeedData.longitude.values[
                          i] + 180) % 360) - 180
                self.TemperatureData.longitude.values[i] = \
                    ((self.TemperatureData.longitude.values[
                          i] + 180) % 360) - 180
            # converts datetime values to float representation of it
            for i in range(0, len(self.CurrentSpeedData.time.values), 1):
                date = dataset_start_time + datetime.timedelta(
                    hours=self.CurrentSpeedData.time.values[i])

                self.CurrentSpeedData.time.values[i] = float(
                    str(date.year) + str(date.month).zfill(2)
                    + str(date.day).zfill(2)) \
                                                       + (
                                                                   date.hour * 3600 + date.minute * 60 + date.second) / 86400
                self.TemperatureData.time.values[i] = float(
                    str(date.year) + str(date.month).zfill(2)
                    + str(date.day).zfill(2)) \
                                                      + (
                                                                  date.hour * 3600 + date.minute * 60 + date.second)


Thanks!

Best,
Lara
Reply all
Reply to author
Forward
0 new messages