An easy to use loader for ISTP-compliant CDF and NetCDF files, as commonly distributed by CDAWeb, AMDA and other space-physics data archives.
Rather than exposing raw variables, PyISTP reads the ISTP metadata
conventions (VAR_TYPE, DEPEND_n, *_PTR, LABLAXIS, ...) and
hands you each data variable together with its resolved axes (time and other
support variables), labels and attributes.
- Free software: GNU General Public License v3
- Documentation: https://pyistp.readthedocs.io.
- Loads ISTP-compliant CDF files (via pycdfpp by default, or spacepy).
- Loads ISTP-compliant NetCDF files (via netCDF4).
- Reads from a file path or directly from an in-memory
bytesbuffer (handy for data fetched over HTTP). - Supports a separate master/skeleton file holding the metadata while the values come from the data file.
- Automatically resolves
DEPEND_nsupport variables into axes, with fallback to the master file. - Converts CDF epoch types and NetCDF CF/Unix time variables to
numpy.datetime64[ns]. - Lazily materializes variable values (the array is read on first access).
- Tolerates many non-ISTP-compliant files (CDAWeb, Cluster/CSA) with warnings rather than failures.
pip install pyistpThe default CDF backend is pycdfpp; spacepy is used as a fallback if
available. NetCDF support requires netCDF4. To force a specific CDF backend,
set the PYISTP_CDFLIB environment variable to pycdfpp or spacepy.
Load a file and inspect its data variables:
import pyistp istp = pyistp.load(file="wi_k0_mfi_20220101_v01.cdf") istp.data_variables() # -> ['BGSEc', 'BF1', 'PGSM', ...] istp.attributes() # global attribute names var = istp.data_variable("BGSEc") var.values # numpy array of values (read lazily) var.axes[0].values # the time axis (numpy.datetime64[ns]) var.attributes # variable attributes var.labels # component labels, if any
Load directly from a buffer, for instance data fetched over HTTP:
import requests, pyistp raw = requests.get( "https://spdf.gsfc.nasa.gov/pub/data/themis/thc/l2/efi/2020/" "thc_l2_efi_20200101_v01.cdf").content istp = pyistp.load(buffer=raw) var = istp.data_variable("thc_eff_dot0_gsm") import matplotlib.pyplot as plt plt.plot(var.axes[0].values, var.values)
Use a separate master/skeleton file for the metadata:
istp = pyistp.load(file="data.cdf", master_file="skeleton.cdf") # or from buffers: istp = pyistp.load(buffer=data_bytes, master_buffer=skeleton_bytes)
This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.