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