Constraint Expressions: subconjunto del lado del servidor#
Motivación#
Muchos servidores OPeNDAP contienen colecciones de datasets que, en agregación, describen un dataset completo (por ejemplo, una simulación multianual). En algunos casos, cada dataset puede contener \(\sim O(10-100)\) variables; esto es particularmente cierto para datos Nivel 2, consulta por ejemplo este dataset ATLAS03 de NASA. Esto significa que PyDAP debe analizar cientos de variables por archivo. PyDAP es un parser rápido de DMRs (la respuesta de metadatos DAP4), pero:
PyDAP no agrega (todavía) datasets ni URLs.
PyDAP no hace comprobaciones CF ni define operaciones basadas en etiquetas.
xarray, por otro lado, permite lectura paralela y agregación de múltiples datasets. Sin embargo, a pesar de las excelentes capacidades paralelas de xarray, puede ser lento durante la agregación de múltiples datasets porque realiza varias comprobaciones sobre los metadatos para que la colección de archivos sea “segura” de abrir y operar, de acuerdo con la lógica interna de xarray. Esto significa que xarray realiza comprobaciones extra para asegurar operaciones seguras basadas en etiquetas, y el tiempo puede crecer con el número de variables.
Note
Aunque xarray tiene un método para descartar variables del xarray.Dataset virtual, solo está disponible después de crear el dataset. Es decir, si tienes cientos de archivos, cada uno con cientos de variables, pero solo te interesan 2-3 variables por archivo, el cliente debe analizar y comprobar todas las variables en todos los archivos para crear un dataset del cual luego descartarás todas menos las 2-3 variables de interés.
Estos factores, en combinación, representan un obstáculo para la exploración inicial de colecciones de datasets OPeNDAP que contienen muchas variables, Groups y otros tipos complejos.
Enfoque#
Se pueden agregar Constraint Expresions (CEs) a la URL del dataset y enviarlas al servidor OPeNDAP remoto para:
Solicitar un subconjunto de variables, y
Solicitar un subconjunto espacial de variables.
Estas CEs son increíblemente potentes desde la perspectiva de la persona usuaria porque pydap, como motor backend de xarray, puede recibir una respuesta DAP mucho más pequeña desde el servidor OPeNDAP remoto. Es decir, las CEs informan al servidor OPeNDAP remoto que debe subdividir cerca de los datos. La respuesta puede ser aproximadamente \(\sim O(1)\) segundo más rápida en total, pero al considerar cientos de URLs, el resultado puede tener un impacto significativo en el rendimiento y la experiencia de uso.
A continuación revisamos Constraint Expressions con datos reales en servidores OPeNDAP. Como hay dos protocolos DAP distintos (consulta Pydap como cliente), revisaremos los dos casos por separado.
from pydap.client import open_url
import numpy as np
import matplotlib.pyplot as plt
Constraint Expressions en DAP4#
Aquí demostramos el uso de CE en arreglos de 1 y 2 dimensiones, en dos datasets distintos:
ATLAS03, datos Nivel 2.
Daily MUR Sea Surface Temperature, datos Nivel 4 proporcionados por PODAAC en JPL.
Note
Para ejemplos más interesantes, mira el ejemplo PACE.
ATLAS03#
Este dataset tiene muchos Groups anidados, con muchas variables dentro. Supongamos que solo nos interesan las variables:
delta_time.lat_ph.lon_ph.
Las tres variables están dentro del Group heights, que a su vez está anidado en el Group llamado gt3r.
Abramos el archivo remoto de forma ingenua, solicitando todas las variables al servidor OPeNDAP (Hyrax en este caso).
data_url = 'http://test.opendap.org:8080/opendap/atlas03/ATL03_20200131234815_05540602_003_01.h5'
%%time
ds = open_url(data_url, protocol='dap4')
CPU times: user 3.86 s, sys: 14.1 ms, total: 3.87 s
Wall time: 4.66 s
Abajo imprimimos todo el árbol de directorios dentro del dataset HDF5.
ds.tree()
.ATL03_20200131234815_05540602_003_01.h5
├──orbit_info
│ ├──crossing_time
│ ├──sc_orient_time
│ ├──orbit_number
│ ├──rgt
│ ├──sc_orient
│ ├──cycle_number
│ └──lan
├──METADATA
│ ├──AcquisitionInformation
│ │ ├──lidar
│ │ ├──lidarDocument
│ │ ├──platform
│ │ └──platformDocument
│ ├──DataQuality
│ │ ├──CompletenessOmission
│ │ └──DomainConsistency
│ ├──ProductSpecificationDocument
│ ├──SeriesIdentification
│ ├──DatasetIdentification
│ ├──Extent
│ ├──QADatasetIdentification
│ ├──Lineage
│ │ ├──ANC25-03
│ │ ├──ANC03
│ │ ├──Control
│ │ ├──ANC28
│ │ ├──ANC12-02
│ │ ├──ANC41
│ │ ├──ANC08
│ │ ├──ANC06-02
│ │ ├──ANC06-03
│ │ ├──ANC22
│ │ ├──ANC11
│ │ ├──ANC04
│ │ ├──ANC38-03
│ │ ├──ANC01
│ │ ├──ANC29
│ │ ├──ANC12-01
│ │ ├──ANC05
│ │ ├──ANC06-01
│ │ ├──ANC36-03
│ │ ├──ANC07
│ │ ├──ANC26-03
│ │ ├──ATL02
│ │ ├──ANC19
│ │ └──ANC23
│ └──ProcessStep
│ ├──Browse
│ ├──Metadata
│ ├──PGE
│ └──QA
├──gt1r
│ ├──bckgrd_atlas
│ │ ├──delta_time
│ │ ├──tlm_height_band1
│ │ ├──bckgrd_rate
│ │ ├──tlm_top_band1
│ │ ├──tlm_top_band2
│ │ ├──bckgrd_int_height_reduced
│ │ ├──bckgrd_hist_top
│ │ ├──bckgrd_counts_reduced
│ │ ├──tlm_height_band2
│ │ ├──bckgrd_int_height
│ │ ├──pce_mframe_cnt
│ │ └──bckgrd_counts
│ ├──geolocation
│ │ ├──reference_photon_lon
│ │ ├──reference_photon_lat
│ │ ├──delta_time
│ │ ├──neutat_delay_derivative
│ │ ├──segment_ph_cnt
│ │ ├──sigma_across
│ │ ├──sigma_lon
│ │ ├──ref_azimuth
│ │ ├──ref_elev
│ │ ├──neutat_ht
│ │ ├──ph_index_beg
│ │ ├──solar_azimuth
│ │ ├──surf_type
│ │ ├──sigma_lat
│ │ ├──tx_pulse_width_lower
│ │ ├──sigma_along
│ │ ├──tx_pulse_skew_est
│ │ ├──tx_pulse_energy
│ │ ├──tx_pulse_width_upper
│ │ ├──sigma_h
│ │ ├──podppd_flag
│ │ ├──velocity_sc
│ │ ├──full_sat_fract
│ │ ├──segment_id
│ │ ├──near_sat_fract
│ │ ├──segment_length
│ │ ├──solar_elevation
│ │ ├──bounce_time_offset
│ │ ├──range_bias_corr
│ │ ├──reference_photon_index
│ │ ├──altitude_sc
│ │ ├──segment_dist_x
│ │ └──neutat_delay_total
│ ├──geophys_corr
│ │ ├──delta_time
│ │ ├──dem_flag
│ │ ├──tide_ocean
│ │ ├──tide_earth
│ │ ├──dac
│ │ ├──tide_load
│ │ ├──dem_h
│ │ ├──tide_equilibrium
│ │ ├──geoid
│ │ ├──tide_oc_pole
│ │ └──tide_pole
│ ├──signal_find_output
│ │ ├──land
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──sea_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──land_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ └──inlandwater
│ │ ├──delta_time
│ │ ├──bckgrd_sigma
│ │ ├──t_pc_delta
│ │ ├──bckgrd_mean
│ │ └──z_pc_delta
│ └──heights
│ ├──lon_ph
│ ├──lat_ph
│ ├──delta_time
│ ├──signal_conf_ph
│ ├──ph_id_pulse
│ ├──h_ph
│ ├──ph_id_channel
│ ├──ph_id_count
│ ├──dist_ph_along
│ ├──pce_mframe_cnt
│ └──dist_ph_across
├──gt2r
│ ├──bckgrd_atlas
│ │ ├──delta_time
│ │ ├──tlm_height_band1
│ │ ├──bckgrd_rate
│ │ ├──tlm_top_band1
│ │ ├──tlm_top_band2
│ │ ├──bckgrd_int_height_reduced
│ │ ├──bckgrd_hist_top
│ │ ├──bckgrd_counts_reduced
│ │ ├──tlm_height_band2
│ │ ├──bckgrd_int_height
│ │ ├──pce_mframe_cnt
│ │ └──bckgrd_counts
│ ├──geolocation
│ │ ├──reference_photon_lon
│ │ ├──reference_photon_lat
│ │ ├──delta_time
│ │ ├──neutat_delay_derivative
│ │ ├──segment_ph_cnt
│ │ ├──sigma_across
│ │ ├──sigma_lon
│ │ ├──ref_azimuth
│ │ ├──ref_elev
│ │ ├──neutat_ht
│ │ ├──ph_index_beg
│ │ ├──solar_azimuth
│ │ ├──surf_type
│ │ ├──sigma_lat
│ │ ├──tx_pulse_width_lower
│ │ ├──sigma_along
│ │ ├──tx_pulse_skew_est
│ │ ├──tx_pulse_energy
│ │ ├──tx_pulse_width_upper
│ │ ├──sigma_h
│ │ ├──podppd_flag
│ │ ├──velocity_sc
│ │ ├──full_sat_fract
│ │ ├──segment_id
│ │ ├──near_sat_fract
│ │ ├──segment_length
│ │ ├──solar_elevation
│ │ ├──bounce_time_offset
│ │ ├──range_bias_corr
│ │ ├──reference_photon_index
│ │ ├──altitude_sc
│ │ ├──segment_dist_x
│ │ └──neutat_delay_total
│ ├──geophys_corr
│ │ ├──delta_time
│ │ ├──dem_flag
│ │ ├──tide_ocean
│ │ ├──tide_earth
│ │ ├──dac
│ │ ├──tide_load
│ │ ├──dem_h
│ │ ├──tide_equilibrium
│ │ ├──geoid
│ │ ├──tide_oc_pole
│ │ └──tide_pole
│ ├──signal_find_output
│ │ ├──sea_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──land_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──land
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ └──inlandwater
│ │ ├──delta_time
│ │ ├──bckgrd_sigma
│ │ ├──t_pc_delta
│ │ ├──bckgrd_mean
│ │ └──z_pc_delta
│ └──heights
│ ├──lon_ph
│ ├──lat_ph
│ ├──delta_time
│ ├──signal_conf_ph
│ ├──ph_id_pulse
│ ├──h_ph
│ ├──ph_id_channel
│ ├──ph_id_count
│ ├──dist_ph_along
│ ├──pce_mframe_cnt
│ └──dist_ph_across
├──gt1l
│ ├──bckgrd_atlas
│ │ ├──delta_time
│ │ ├──tlm_height_band1
│ │ ├──bckgrd_rate
│ │ ├──tlm_top_band1
│ │ ├──tlm_top_band2
│ │ ├──bckgrd_int_height_reduced
│ │ ├──bckgrd_hist_top
│ │ ├──bckgrd_counts_reduced
│ │ ├──tlm_height_band2
│ │ ├──bckgrd_int_height
│ │ ├──pce_mframe_cnt
│ │ └──bckgrd_counts
│ ├──geolocation
│ │ ├──reference_photon_lon
│ │ ├──reference_photon_lat
│ │ ├──delta_time
│ │ ├──neutat_delay_derivative
│ │ ├──segment_ph_cnt
│ │ ├──sigma_across
│ │ ├──sigma_lon
│ │ ├──ref_azimuth
│ │ ├──ref_elev
│ │ ├──neutat_ht
│ │ ├──ph_index_beg
│ │ ├──solar_azimuth
│ │ ├──surf_type
│ │ ├──sigma_lat
│ │ ├──tx_pulse_width_lower
│ │ ├──sigma_along
│ │ ├──tx_pulse_skew_est
│ │ ├──tx_pulse_energy
│ │ ├──tx_pulse_width_upper
│ │ ├──sigma_h
│ │ ├──podppd_flag
│ │ ├──velocity_sc
│ │ ├──full_sat_fract
│ │ ├──segment_id
│ │ ├──near_sat_fract
│ │ ├──segment_length
│ │ ├──solar_elevation
│ │ ├──bounce_time_offset
│ │ ├──range_bias_corr
│ │ ├──reference_photon_index
│ │ ├──altitude_sc
│ │ ├──segment_dist_x
│ │ └──neutat_delay_total
│ ├──geophys_corr
│ │ ├──delta_time
│ │ ├──dem_flag
│ │ ├──tide_ocean
│ │ ├──tide_earth
│ │ ├──dac
│ │ ├──tide_load
│ │ ├──dem_h
│ │ ├──tide_equilibrium
│ │ ├──geoid
│ │ ├──tide_oc_pole
│ │ └──tide_pole
│ ├──signal_find_output
│ │ ├──land
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──sea_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──land_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ └──inlandwater
│ │ ├──delta_time
│ │ ├──bckgrd_sigma
│ │ ├──t_pc_delta
│ │ ├──bckgrd_mean
│ │ └──z_pc_delta
│ └──heights
│ ├──lon_ph
│ ├──lat_ph
│ ├──delta_time
│ ├──signal_conf_ph
│ ├──ph_id_pulse
│ ├──h_ph
│ ├──ph_id_channel
│ ├──ph_id_count
│ ├──dist_ph_along
│ ├──pce_mframe_cnt
│ └──dist_ph_across
├──quality_assessment
│ ├──gt1r
│ │ ├──qa_perc_signal_conf_ph_high
│ │ ├──qa_perc_signal_conf_ph_low
│ │ ├──qa_perc_signal_conf_ph_med
│ │ ├──qa_total_signal_conf_ph_high
│ │ ├──qa_perc_surf_type
│ │ ├──qa_total_signal_conf_ph_low
│ │ └──qa_total_signal_conf_ph_med
│ ├──gt2r
│ │ ├──qa_perc_signal_conf_ph_high
│ │ ├──qa_perc_signal_conf_ph_low
│ │ ├──qa_perc_signal_conf_ph_med
│ │ ├──qa_total_signal_conf_ph_high
│ │ ├──qa_perc_surf_type
│ │ ├──qa_total_signal_conf_ph_low
│ │ └──qa_total_signal_conf_ph_med
│ ├──gt1l
│ │ ├──qa_perc_signal_conf_ph_high
│ │ ├──qa_perc_signal_conf_ph_low
│ │ ├──qa_perc_signal_conf_ph_med
│ │ ├──qa_total_signal_conf_ph_high
│ │ ├──qa_perc_surf_type
│ │ ├──qa_total_signal_conf_ph_low
│ │ └──qa_total_signal_conf_ph_med
│ ├──gt3l
│ │ ├──qa_perc_signal_conf_ph_high
│ │ ├──qa_perc_signal_conf_ph_low
│ │ ├──qa_perc_signal_conf_ph_med
│ │ ├──qa_total_signal_conf_ph_high
│ │ ├──qa_perc_surf_type
│ │ ├──qa_total_signal_conf_ph_low
│ │ └──qa_total_signal_conf_ph_med
│ ├──gt2l
│ │ ├──qa_perc_signal_conf_ph_high
│ │ ├──qa_perc_signal_conf_ph_low
│ │ ├──qa_perc_signal_conf_ph_med
│ │ ├──qa_total_signal_conf_ph_high
│ │ ├──qa_perc_surf_type
│ │ ├──qa_total_signal_conf_ph_low
│ │ └──qa_total_signal_conf_ph_med
│ ├──gt3r
│ │ ├──qa_perc_signal_conf_ph_high
│ │ ├──qa_perc_signal_conf_ph_low
│ │ ├──qa_perc_signal_conf_ph_med
│ │ ├──qa_total_signal_conf_ph_high
│ │ ├──qa_perc_surf_type
│ │ ├──qa_total_signal_conf_ph_low
│ │ └──qa_total_signal_conf_ph_med
│ ├──delta_time
│ ├──qa_granule_fail_reason
│ └──qa_granule_pass_fail
├──atlas_impulse_response
│ ├──pce1_spot1
│ │ └──tep_histogram
│ │ ├──tep_hist_time
│ │ ├──tep_tod
│ │ ├──tep_duration
│ │ ├──reference_tep_flag
│ │ ├──tep_hist_sum
│ │ ├──tep_hist
│ │ └──tep_bckgrd
│ └──pce2_spot3
│ └──tep_histogram
│ ├──tep_hist_time
│ ├──tep_tod
│ ├──tep_duration
│ ├──reference_tep_flag
│ ├──tep_hist_sum
│ ├──tep_hist
│ └──tep_bckgrd
├──gt3l
│ ├──bckgrd_atlas
│ │ ├──delta_time
│ │ ├──tlm_height_band1
│ │ ├──bckgrd_rate
│ │ ├──tlm_top_band1
│ │ ├──tlm_top_band2
│ │ ├──bckgrd_int_height_reduced
│ │ ├──bckgrd_hist_top
│ │ ├──bckgrd_counts_reduced
│ │ ├──tlm_height_band2
│ │ ├──bckgrd_int_height
│ │ ├──pce_mframe_cnt
│ │ └──bckgrd_counts
│ ├──geolocation
│ │ ├──reference_photon_lon
│ │ ├──reference_photon_lat
│ │ ├──delta_time
│ │ ├──neutat_delay_derivative
│ │ ├──segment_ph_cnt
│ │ ├──sigma_across
│ │ ├──sigma_lon
│ │ ├──ref_azimuth
│ │ ├──ref_elev
│ │ ├──neutat_ht
│ │ ├──ph_index_beg
│ │ ├──solar_azimuth
│ │ ├──surf_type
│ │ ├──sigma_lat
│ │ ├──tx_pulse_width_lower
│ │ ├──sigma_along
│ │ ├──tx_pulse_skew_est
│ │ ├──tx_pulse_energy
│ │ ├──tx_pulse_width_upper
│ │ ├──sigma_h
│ │ ├──podppd_flag
│ │ ├──velocity_sc
│ │ ├──full_sat_fract
│ │ ├──segment_id
│ │ ├──near_sat_fract
│ │ ├──segment_length
│ │ ├──solar_elevation
│ │ ├──bounce_time_offset
│ │ ├──range_bias_corr
│ │ ├──reference_photon_index
│ │ ├──altitude_sc
│ │ ├──segment_dist_x
│ │ └──neutat_delay_total
│ ├──geophys_corr
│ │ ├──delta_time
│ │ ├──dem_flag
│ │ ├──tide_ocean
│ │ ├──tide_earth
│ │ ├──dac
│ │ ├──tide_load
│ │ ├──dem_h
│ │ ├──tide_equilibrium
│ │ ├──geoid
│ │ ├──tide_oc_pole
│ │ └──tide_pole
│ ├──signal_find_output
│ │ ├──sea_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──land_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──land
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ └──inlandwater
│ │ ├──delta_time
│ │ ├──bckgrd_sigma
│ │ ├──t_pc_delta
│ │ ├──bckgrd_mean
│ │ └──z_pc_delta
│ └──heights
│ ├──lon_ph
│ ├──lat_ph
│ ├──delta_time
│ ├──signal_conf_ph
│ ├──ph_id_pulse
│ ├──h_ph
│ ├──ph_id_channel
│ ├──ph_id_count
│ ├──dist_ph_along
│ ├──pce_mframe_cnt
│ └──dist_ph_across
├──gt2l
│ ├──bckgrd_atlas
│ │ ├──delta_time
│ │ ├──tlm_height_band1
│ │ ├──bckgrd_rate
│ │ ├──tlm_top_band1
│ │ ├──tlm_top_band2
│ │ ├──bckgrd_int_height_reduced
│ │ ├──bckgrd_hist_top
│ │ ├──bckgrd_counts_reduced
│ │ ├──tlm_height_band2
│ │ ├──bckgrd_int_height
│ │ ├──pce_mframe_cnt
│ │ └──bckgrd_counts
│ ├──geolocation
│ │ ├──reference_photon_lon
│ │ ├──reference_photon_lat
│ │ ├──delta_time
│ │ ├──neutat_delay_derivative
│ │ ├──segment_ph_cnt
│ │ ├──sigma_across
│ │ ├──sigma_lon
│ │ ├──ref_azimuth
│ │ ├──ref_elev
│ │ ├──neutat_ht
│ │ ├──ph_index_beg
│ │ ├──solar_azimuth
│ │ ├──surf_type
│ │ ├──sigma_lat
│ │ ├──tx_pulse_width_lower
│ │ ├──sigma_along
│ │ ├──tx_pulse_skew_est
│ │ ├──tx_pulse_energy
│ │ ├──tx_pulse_width_upper
│ │ ├──sigma_h
│ │ ├──podppd_flag
│ │ ├──velocity_sc
│ │ ├──full_sat_fract
│ │ ├──segment_id
│ │ ├──near_sat_fract
│ │ ├──segment_length
│ │ ├──solar_elevation
│ │ ├──bounce_time_offset
│ │ ├──range_bias_corr
│ │ ├──reference_photon_index
│ │ ├──altitude_sc
│ │ ├──segment_dist_x
│ │ └──neutat_delay_total
│ ├──geophys_corr
│ │ ├──delta_time
│ │ ├──dem_flag
│ │ ├──tide_ocean
│ │ ├──tide_earth
│ │ ├──dac
│ │ ├──tide_load
│ │ ├──dem_h
│ │ ├──tide_equilibrium
│ │ ├──geoid
│ │ ├──tide_oc_pole
│ │ └──tide_pole
│ ├──signal_find_output
│ │ ├──sea_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──land_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──land
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ └──inlandwater
│ │ ├──delta_time
│ │ ├──bckgrd_sigma
│ │ ├──t_pc_delta
│ │ ├──bckgrd_mean
│ │ └──z_pc_delta
│ └──heights
│ ├──lon_ph
│ ├──lat_ph
│ ├──delta_time
│ ├──signal_conf_ph
│ ├──ph_id_pulse
│ ├──h_ph
│ ├──ph_id_channel
│ ├──ph_id_count
│ ├──dist_ph_along
│ ├──pce_mframe_cnt
│ └──dist_ph_across
├──ancillary_data
│ ├──calibrations
│ │ ├──dead_time_radiometric_signal_loss
│ │ │ ├──gt1l
│ │ │ │ ├──dead_time
│ │ │ │ ├──rad_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ ├──gt2l
│ │ │ │ ├──dead_time
│ │ │ │ ├──rad_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ ├──gt1r
│ │ │ │ ├──dead_time
│ │ │ │ ├──rad_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ ├──gt2r
│ │ │ │ ├──dead_time
│ │ │ │ ├──rad_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ ├──gt3l
│ │ │ │ ├──dead_time
│ │ │ │ ├──rad_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ ├──gt3r
│ │ │ │ ├──dead_time
│ │ │ │ ├──rad_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ └──cal34_product
│ │ ├──first_photon_bias
│ │ │ ├──gt1l
│ │ │ │ ├──dead_time
│ │ │ │ ├──ffb_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ ├──gt2l
│ │ │ │ ├──dead_time
│ │ │ │ ├──ffb_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ ├──gt1r
│ │ │ │ ├──dead_time
│ │ │ │ ├──ffb_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ ├──gt2r
│ │ │ │ ├──dead_time
│ │ │ │ ├──ffb_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ ├──gt3l
│ │ │ │ ├──dead_time
│ │ │ │ ├──ffb_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ ├──gt3r
│ │ │ │ ├──dead_time
│ │ │ │ ├──ffb_corr
│ │ │ │ ├──strength
│ │ │ │ └──width
│ │ │ └──cal19_product
│ │ ├──low_link_impulse_response
│ │ │ ├──gt1r
│ │ │ │ ├──hist
│ │ │ │ └──total_events
│ │ │ ├──gt2r
│ │ │ │ ├──hist
│ │ │ │ └──total_events
│ │ │ ├──gt1l
│ │ │ │ ├──hist
│ │ │ │ └──total_events
│ │ │ ├──gt3l
│ │ │ │ ├──hist
│ │ │ │ └──total_events
│ │ │ ├──gt2l
│ │ │ │ ├──hist
│ │ │ │ └──total_events
│ │ │ ├──gt3r
│ │ │ │ ├──hist
│ │ │ │ └──total_events
│ │ │ ├──hist_x
│ │ │ ├──laser
│ │ │ ├──mode
│ │ │ ├──return_source
│ │ │ ├──cal20_product
│ │ │ ├──num_bins
│ │ │ ├──temperature
│ │ │ ├──bin_width
│ │ │ └──side
│ │ ├──dead_time
│ │ │ ├──gt1r
│ │ │ │ ├──dead_time
│ │ │ │ └──sigma
│ │ │ ├──gt2r
│ │ │ │ ├──dead_time
│ │ │ │ └──sigma
│ │ │ ├──gt1l
│ │ │ │ ├──dead_time
│ │ │ │ └──sigma
│ │ │ ├──gt3l
│ │ │ │ ├──dead_time
│ │ │ │ └──sigma
│ │ │ ├──gt2l
│ │ │ │ ├──dead_time
│ │ │ │ └──sigma
│ │ │ ├──gt3r
│ │ │ │ ├──dead_time
│ │ │ │ └──sigma
│ │ │ ├──temperature
│ │ │ ├──cal42_product
│ │ │ └──side
│ │ └──ds_channel
│ ├──atlas_engineering
│ │ ├──transmit
│ │ │ ├──tx_pulse_distribution
│ │ │ ├──tx_pulse_skew_est
│ │ │ ├──tx_pulse_thresh_lower
│ │ │ ├──tx_pulse_thresh_upper
│ │ │ ├──tx_pulse_width_lower
│ │ │ ├──tx_pulse_width_upper
│ │ │ └──tx_pulse_energy
│ │ ├──receiver
│ │ │ ├──rx_bckgrd_sensitivity
│ │ │ └──rx_return_sensitivity
│ │ ├──ds_gt
│ │ ├──ds_stat
│ │ ├──spd_ab_flag
│ │ ├──det_ab_flag
│ │ ├──lrs_ab_flag
│ │ ├──tams_ab_flag
│ │ ├──laser_12_flag
│ │ ├──pdu_ab_flag
│ │ ├──ph_uncorrelated_error
│ │ └──hvpc_ab_flag
│ ├──gt1r
│ │ └──signal_find_input
│ │ ├──sig_find_t_inc
│ │ ├──alpha_max
│ │ ├──delta_z_bg
│ │ ├──e_linfit_edit
│ │ ├──e_m
│ │ ├──snrlow
│ │ ├──nslw_v
│ │ ├──nphot_min
│ │ ├──delta_zmin
│ │ ├──delta_t_max
│ │ ├──lslant_flag
│ │ ├──n_delta_z2
│ │ ├──e_m_mult
│ │ ├──delta_t_min
│ │ ├──r2
│ │ ├──snrmed
│ │ ├──n_delta_z1
│ │ ├──min_fit_time_fact
│ │ ├──pc_bckgrd_flag
│ │ ├──t_gap_big
│ │ ├──e_a
│ │ ├──delta_zmax2
│ │ ├──nslw
│ │ ├──e_linfit_slant
│ │ ├──addpad_flag
│ │ ├──nbin_min
│ │ ├──htspanmin
│ │ ├──alpha_inc
│ │ ├──out_edit_flag
│ │ ├──delta_t_gap_min
│ │ ├──delta_t_lin_fit
│ │ └──r
│ ├──gt2r
│ │ └──signal_find_input
│ │ ├──sig_find_t_inc
│ │ ├──alpha_max
│ │ ├──delta_z_bg
│ │ ├──e_linfit_edit
│ │ ├──e_m
│ │ ├──snrlow
│ │ ├──nslw_v
│ │ ├──nphot_min
│ │ ├──delta_zmin
│ │ ├──delta_t_max
│ │ ├──lslant_flag
│ │ ├──n_delta_z2
│ │ ├──e_m_mult
│ │ ├──delta_t_min
│ │ ├──r2
│ │ ├──snrmed
│ │ ├──n_delta_z1
│ │ ├──min_fit_time_fact
│ │ ├──pc_bckgrd_flag
│ │ ├──t_gap_big
│ │ ├──e_a
│ │ ├──delta_zmax2
│ │ ├──nslw
│ │ ├──e_linfit_slant
│ │ ├──addpad_flag
│ │ ├──nbin_min
│ │ ├──htspanmin
│ │ ├──alpha_inc
│ │ ├──out_edit_flag
│ │ ├──delta_t_gap_min
│ │ ├──delta_t_lin_fit
│ │ └──r
│ ├──gt1l
│ │ └──signal_find_input
│ │ ├──sig_find_t_inc
│ │ ├──alpha_max
│ │ ├──delta_z_bg
│ │ ├──e_linfit_edit
│ │ ├──e_m
│ │ ├──snrlow
│ │ ├──nslw_v
│ │ ├──nphot_min
│ │ ├──delta_zmin
│ │ ├──delta_t_max
│ │ ├──lslant_flag
│ │ ├──n_delta_z2
│ │ ├──e_m_mult
│ │ ├──delta_t_min
│ │ ├──r2
│ │ ├──snrmed
│ │ ├──n_delta_z1
│ │ ├──min_fit_time_fact
│ │ ├──pc_bckgrd_flag
│ │ ├──t_gap_big
│ │ ├──e_a
│ │ ├──delta_zmax2
│ │ ├──nslw
│ │ ├──e_linfit_slant
│ │ ├──addpad_flag
│ │ ├──nbin_min
│ │ ├──htspanmin
│ │ ├──alpha_inc
│ │ ├──out_edit_flag
│ │ ├──delta_t_gap_min
│ │ ├──delta_t_lin_fit
│ │ └──r
│ ├──altimetry
│ │ ├──atl03_pad
│ │ ├──min_full_sat
│ │ ├──min_near_sat
│ │ ├──min_sat_h
│ │ ├──podppd_pad
│ │ └──band_tol
│ ├──gt3l
│ │ └──signal_find_input
│ │ ├──sig_find_t_inc
│ │ ├──alpha_max
│ │ ├──delta_z_bg
│ │ ├──e_linfit_edit
│ │ ├──e_m
│ │ ├──snrlow
│ │ ├──nslw_v
│ │ ├──nphot_min
│ │ ├──delta_zmin
│ │ ├──delta_t_max
│ │ ├──lslant_flag
│ │ ├──n_delta_z2
│ │ ├──e_m_mult
│ │ ├──delta_t_min
│ │ ├──r2
│ │ ├──snrmed
│ │ ├──n_delta_z1
│ │ ├──min_fit_time_fact
│ │ ├──pc_bckgrd_flag
│ │ ├──t_gap_big
│ │ ├──e_a
│ │ ├──delta_zmax2
│ │ ├──nslw
│ │ ├──e_linfit_slant
│ │ ├──addpad_flag
│ │ ├──nbin_min
│ │ ├──htspanmin
│ │ ├──alpha_inc
│ │ ├──out_edit_flag
│ │ ├──delta_t_gap_min
│ │ ├──delta_t_lin_fit
│ │ └──r
│ ├──gt2l
│ │ └──signal_find_input
│ │ ├──sig_find_t_inc
│ │ ├──alpha_max
│ │ ├──delta_z_bg
│ │ ├──e_linfit_edit
│ │ ├──e_m
│ │ ├──snrlow
│ │ ├──nslw_v
│ │ ├──nphot_min
│ │ ├──delta_zmin
│ │ ├──delta_t_max
│ │ ├──lslant_flag
│ │ ├──n_delta_z2
│ │ ├──e_m_mult
│ │ ├──delta_t_min
│ │ ├──r2
│ │ ├──snrmed
│ │ ├──n_delta_z1
│ │ ├──min_fit_time_fact
│ │ ├──pc_bckgrd_flag
│ │ ├──t_gap_big
│ │ ├──e_a
│ │ ├──delta_zmax2
│ │ ├──nslw
│ │ ├──e_linfit_slant
│ │ ├──addpad_flag
│ │ ├──nbin_min
│ │ ├──htspanmin
│ │ ├──alpha_inc
│ │ ├──out_edit_flag
│ │ ├──delta_t_gap_min
│ │ ├──delta_t_lin_fit
│ │ └──r
│ ├──tep
│ │ ├──ds_gt
│ │ ├──tep_valid_spot
│ │ ├──tep_range_prim
│ │ ├──tep_start_x
│ │ ├──min_tep_secs
│ │ ├──tep_sec_window
│ │ ├──tep_rm_noise
│ │ ├──tep_bin_size
│ │ ├──n_tep_bins
│ │ ├──tep_normalize
│ │ ├──min_tep_ph
│ │ ├──tep_peak_bins
│ │ ├──tep_gap_size
│ │ └──tep_prim_window
│ ├──gt3r
│ │ └──signal_find_input
│ │ ├──sig_find_t_inc
│ │ ├──alpha_max
│ │ ├──delta_z_bg
│ │ ├──e_linfit_edit
│ │ ├──e_m
│ │ ├──snrlow
│ │ ├──nslw_v
│ │ ├──nphot_min
│ │ ├──delta_zmin
│ │ ├──delta_t_max
│ │ ├──lslant_flag
│ │ ├──n_delta_z2
│ │ ├──e_m_mult
│ │ ├──delta_t_min
│ │ ├──r2
│ │ ├──snrmed
│ │ ├──n_delta_z1
│ │ ├──min_fit_time_fact
│ │ ├──pc_bckgrd_flag
│ │ ├──t_gap_big
│ │ ├──e_a
│ │ ├──delta_zmax2
│ │ ├──nslw
│ │ ├──e_linfit_slant
│ │ ├──addpad_flag
│ │ ├──nbin_min
│ │ ├──htspanmin
│ │ ├──alpha_inc
│ │ ├──out_edit_flag
│ │ ├──delta_t_gap_min
│ │ ├──delta_t_lin_fit
│ │ └──r
│ ├──start_delta_time
│ ├──end_geoseg
│ ├──version
│ ├──end_region
│ ├──atlas_sdp_gps_epoch
│ ├──end_rgt
│ ├──end_delta_time
│ ├──end_orbit
│ ├──start_cycle
│ ├──data_end_utc
│ ├──control
│ ├──start_gpssow
│ ├──granule_end_utc
│ ├──end_cycle
│ ├──granule_start_utc
│ ├──release
│ ├──start_geoseg
│ ├──start_orbit
│ ├──data_start_utc
│ ├──end_gpsweek
│ ├──start_rgt
│ ├──end_gpssow
│ ├──start_region
│ └──start_gpsweek
├──gt3r
│ ├──bckgrd_atlas
│ │ ├──delta_time
│ │ ├──tlm_height_band1
│ │ ├──bckgrd_rate
│ │ ├──tlm_top_band1
│ │ ├──tlm_top_band2
│ │ ├──bckgrd_int_height_reduced
│ │ ├──bckgrd_hist_top
│ │ ├──bckgrd_counts_reduced
│ │ ├──tlm_height_band2
│ │ ├──bckgrd_int_height
│ │ ├──pce_mframe_cnt
│ │ └──bckgrd_counts
│ ├──geolocation
│ │ ├──reference_photon_lon
│ │ ├──reference_photon_lat
│ │ ├──delta_time
│ │ ├──neutat_delay_derivative
│ │ ├──segment_ph_cnt
│ │ ├──sigma_across
│ │ ├──sigma_lon
│ │ ├──ref_azimuth
│ │ ├──ref_elev
│ │ ├──neutat_ht
│ │ ├──ph_index_beg
│ │ ├──solar_azimuth
│ │ ├──surf_type
│ │ ├──sigma_lat
│ │ ├──tx_pulse_width_lower
│ │ ├──sigma_along
│ │ ├──tx_pulse_skew_est
│ │ ├──tx_pulse_energy
│ │ ├──tx_pulse_width_upper
│ │ ├──sigma_h
│ │ ├──podppd_flag
│ │ ├──velocity_sc
│ │ ├──full_sat_fract
│ │ ├──segment_id
│ │ ├──near_sat_fract
│ │ ├──segment_length
│ │ ├──solar_elevation
│ │ ├──bounce_time_offset
│ │ ├──range_bias_corr
│ │ ├──reference_photon_index
│ │ ├──altitude_sc
│ │ ├──segment_dist_x
│ │ └──neutat_delay_total
│ ├──geophys_corr
│ │ ├──delta_time
│ │ ├──dem_flag
│ │ ├──tide_ocean
│ │ ├──tide_earth
│ │ ├──dac
│ │ ├──tide_load
│ │ ├──dem_h
│ │ ├──tide_equilibrium
│ │ ├──geoid
│ │ ├──tide_oc_pole
│ │ └──tide_pole
│ ├──signal_find_output
│ │ ├──sea_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──land_ice
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ ├──land
│ │ │ ├──delta_time
│ │ │ ├──bckgrd_sigma
│ │ │ ├──t_pc_delta
│ │ │ ├──bckgrd_mean
│ │ │ └──z_pc_delta
│ │ └──inlandwater
│ │ ├──delta_time
│ │ ├──bckgrd_sigma
│ │ ├──t_pc_delta
│ │ ├──bckgrd_mean
│ │ └──z_pc_delta
│ └──heights
│ ├──lon_ph
│ ├──lat_ph
│ ├──delta_time
│ ├──signal_conf_ph
│ ├──ph_id_pulse
│ ├──h_ph
│ ├──ph_id_channel
│ ├──ph_id_count
│ ├──dist_ph_along
│ ├──pce_mframe_cnt
│ └──dist_ph_across
├──ds_surf_type
└──ds_xyz
Debemos notar que los mismos nombres de variables aparecen en otros grupos a lo largo del archivo, en otros Groups distintos.
El protocolo DAP4 facilita identificar cada variable definida dentro de un Group con un Fully Qualyfying Name único. En este caso, el FQN de cada variable, similar a navegar por un sistema de archivos, es:
VarName |
FQN_VarName |
|---|---|
|
|
|
|
|
|
Con este conocimiento, queremos solicitar solo estas variables del DMR del servidor. La especificación DAP4 para Constraint Expressions es:
Probémoslo ahora:
data_urlCE = data_url+'?dap4.ce=/gt3r/heights/delta_time;/gt3r/heights/lat_ph;/gt3r/heights/lon_ph'
%%time
ds = open_url(data_urlCE, protocol='dap4')
CPU times: user 30.1 ms, sys: 973 μs, total: 31 ms
Wall time: 581 ms
Esto es un orden de magnitud más rápido que antes.#
Como Groups NO forman parte del modelo de datos DAP2, no podemos ilustrar la CE en DAP2 con el dataset ATLAS03. En su lugar, ahora miramos el dataset COADS, que tiene arreglos 2D.
Subconjunto espacial#
Continuando con la demostración de CEs en el modelo de datos DAP4, ahora queremos solicitar solo un subconjunto de las variables. Primero observamos el dataset completo.
%%time
data_url = 'http://test.opendap.org:8080/opendap/ghrsst/20210102090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.h5'
CPU times: user 1e+03 ns, sys: 1 μs, total: 2 μs
Wall time: 4.05 μs
%%time
ds = open_url(data_url, protocol='dap4')
CPU times: user 37.3 ms, sys: 1.04 ms, total: 38.3 ms
Wall time: 363 ms
ds.tree()
.20210102090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.h5
├──time
├──lat
├──lon
├──mask
├──sea_ice_fraction
├──dt_1km_data
├──analysed_sst
├──analysis_error
└──sst_anomaly
Igual que antes en el modelo de datos DAP4, tenemos:
VarName |
FQN_VarName |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ds['analysed_sst'].shape
(1, 17999, 36000)
ds['analysed_sst'].attributes
{'long_name': 'analysed sea surface temperature',
'standard_name': 'sea_surface_foundation_temperature',
'units': 'kelvin',
'_FillValue': -32768,
'add_offset': 298.15,
'scale_factor': 0.001,
'valid_min': -32767,
'valid_max': 32767,
'comment': '"Final" version using Multi-Resolution Variational Analysis (MRVA) method for interpolation',
'coordinates': 'lon lat',
'source': 'MODIS_T-JPL, MODIS_A-JPL, AMSR2-REMSS, AVHRRMTA_G-NAVO, AVHRRMTB_G-NAVO, iQUAM-NOAA/NESDIS, Ice_Conc-OSISAF',
'Maps': ('/lon', '/lat', '/time')}
print('Dimensions of variable:', ds['analysed_sst'].dimensions)
Dimensions of variable: ('/time', '/lat', '/lon')
ds.dimensions
{'time': 1, 'lat': 17999, 'lon': 36000}
Vemos que la variable tiene tres dimensiones, y estas coinciden con las del dataset completo.
Subconjunto espacial#
Todavía no hemos descargado/recuperado ningún dato. Solo PyDAP ha solicitado hasta ahora el DMR. Considera el escenario donde solo queremos inspeccionar un subconjunto espacial de los datos, definido por los rangos de índices, también llamados hyperslabs.
Supongamos que queremos recuperar solo los primeros 100 puntos de lat y los últimos 300 puntos de lon, de todas las variables del dataset. En DAP4 hay dos opciones para lograr esto con la URL.
Enfoque tradicional. Define el hyperslab para cada variable que solicites. El Data Request Form permite a las personas usuarias construir dichas URLs de forma interactiva (seleccionando casillas y modificando hyperslabs). Siguiendo este enfoque, obtienes la siguiente URL restringida:
data_url + ?dap4.ce=/time;/lat[0:1:100];/lon[35700:1:];/mask[0][0:1:100][35700:1:];/sea_ice_fraction[0][0:1:100][35700:1:];/dt_1km_data[0][0:1:100][35700:1:];/analysed_sst[0][0:1:100][35700:1:];/analysed_sst[0][0:1:100][35700:1:];/analysis_error[0][0:1:100][35700:1:];/sst_anomaly[0][0:1:100][35700:1:]
Probémoslo.
%%time
nds = open_url(data_url+'?dap4.ce=/time[0];/lat[0:1:300];/lon[35699:1:35999];/mask[0][0:1:300][35699:1:35999];/sea_ice_fraction[0][0:1:300][35699:1:35999];/dt_1km_data[0][0:1:300][35699:1:35999];/analysed_sst[0][0:1:300][35699:1:35999];/analysis_error[0][0:1:300][35699:1:35999];/sst_anomaly[0][0:1:300][35699:1:35999]', protocol='dap4')
CPU times: user 30.8 ms, sys: 988 μs, total: 31.8 ms
Wall time: 228 ms
nds
<DatasetType with children 'time', 'lat', 'lon', 'mask', 'sea_ice_fraction', 'dt_1km_data', 'analysed_sst', 'analysis_error', 'sst_anomaly'>
nds['/analysed_sst'].shape
(1, 301, 301)
nds['/lon'].shape
(301,)
El subconjunto espacial descrito arriba funcionó bien. Es muy verboso y tienes que definir explícitamente el tamaño de todas las variables si quieres que el dataset subconjunto resultante sea autoconsistente. Por ejemplo, puede ser fácil definir el subconjunto espacial solo en una variable y no en el resto.
%%time
nds = open_url(data_url+'?dap4.ce=/time;/lat;/lon;/mask;/sea_ice_fraction;/dt_1km_data;/analysed_sst[0][0:1:300][35699:1:35999]', protocol='dap4')
CPU times: user 30 ms, sys: 2.15 ms, total: 32.1 ms
Wall time: 426 ms
nds['lat'].shape != nds['analysed_sst'].shape
True
nds['lat'].shape, nds['analysed_sst'].shape
((17999,), (1, 301, 301))
A continuación proporcionamos un enfoque alternativo que es menos propenso a errores y usa Shared Dimensions.
Shared Dimensions: este enfoque alternativo se puede usar para definir el subconjunto espacial mediante las dimensiones. La sintaxis es:
data_url + ?dap4.ce=<FQN_Dim1>=[subset];<FQN_Dim2>=[subset];<FQN_Var1>;<FQN_Var3>;<FQN_Var3>;...<FQN_VarN>
Donde <FQN_Var1> puede ser igual a <FQN_Dim1>.
En la sintaxis anterior,
a) El subconjunto se define primero en las dimensiones mediante los signos =. Las dimensiones pueden ser globales (a nivel raíz) o estar dentro de un Group.
b) Luego la persona usuaria define las variables que PyDAP debe incluir en la solicitud. El subconjunto definido en el paso anterior se aplicará a la variable.
Usando el ejemplo, la URL mucho más simplificada se convierte en:
%%time
nds = open_url(data_url+"?dap4.ce=/lat=[0:1:300];/lon=[35699:1:35999];/time;/lat;/lon;/mask;/sea_ice_fraction;/dt_1km_data;/analysed_sst;/analysis_error;/sst_anomaly", protocol='dap4')
CPU times: user 25.4 ms, sys: 1.07 ms, total: 26.5 ms
Wall time: 199 ms
nds.tree()
.20210102090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.h5
├──time
├──lat
├──lon
├──mask
├──sea_ice_fraction
├──dt_1km_data
├──analysed_sst
├──analysis_error
└──sst_anomaly
nds['/analysed_sst'].shape == nds['sst_anomaly'].shape
True