Loading data#
This page walks through three different ways to get data into Python, each suited to a different kind of source. The point isn’t to learn the API of any one tool — you’ll meet pandas and xarray properly in later modules — but to see that “data access” is not one thing. Different sources call for different approaches.
Why programmatic access matters: manual download steps break reproducibility. If your code loads data from a URL or DOI directly, anyone running it (including future-you) gets the same data — no guessing about which file you used or where you stored it.
For each example below, open a new notebook in your environment and copy-paste the code into a cell to run it. Watch what comes back.
1. CSV over HTTP — pandas.read_csv#
The simplest case: a CSV file sitting at a public URL. pandas.read_csv can read directly from a URL without you having to download it first.
We’ll use atmospheric CO2 measurements from Mauna Loa — the famous Keeling Curve, recorded by the Scripps CO2 program since 1958. We read it from a snapshot hosted in the course repository, because the original Scripps server isn’t reachable from every environment (the LEAP hub can’t reach it, for example).
Try it
In a code cell, run:
import pandas as pd
url = "https://raw.githubusercontent.com/earth-DS-ML/summer_2026/refs/heads/main/lectures_DS/data/monthly_in_situ_co2_mlo.csv"
columns = ["year", "month", "date_excel", "date", "co2", "co2_seasonally_adjusted",
"fit", "fit_seasonally_adjusted", "co2_filled", "co2_filled_seasonally_adjusted",
"station"]
df = pd.read_csv(url, skiprows=64, names=columns, na_values=-99.99)
df.head()
You should see a table with year, month, date, and CO2 columns. Notice that you didn’t have to download anything to your computer — pandas streamed the data from the URL directly into memory.
Real files often need a few options. This one opens with a long comment header followed by a three-row column header — 64 lines in all — so skiprows=64 jumps past it. We then give pandas our own column names, and na_values=-99.99 tells it that Scripps’s -99.99 placeholder means missing, so those entries load as NaN instead of being mistaken for real measurements.
Reference: Why this works — most HTTP-served files are public and don’t require authentication, so
pandascan fetch them with a plain GET request. For files behind logins or paywalls, you’d need additional setup.
2. NetCDF over OPeNDAP — xarray.open_dataset#
For gridded scientific data (temperature, precipitation, sea-surface height, etc.), the standard format is NetCDF. The standard protocol for serving NetCDF files over the network is OPeNDAP — it lets you access just the parts of a large dataset you need, without downloading the whole file.
We’ll use the IRI Data Library’s precipitation dataset — global monthly rain estimates.
Try it
In a code cell, run:
import xarray as xr
url = "http://iridl.ldeo.columbia.edu/expert/SOURCES/.NOAA/.NCEP/.CPC/.UNIFIED_PRCP/.GAUGE_BASED/.GLOBAL/.v1p0/.Monthly/.RETRO/.rain/dods"
ds = xr.open_dataset(url, decode_times=False)
ds
You’ll see a Dataset object with dimensions Y (latitude), X (longitude), and T (time). This is a lot richer than a pandas DataFrame — it carries coordinates, units, and other metadata along with the data values.
The decode_times=False argument is a workaround — the IRI server uses non-standard time encoding that xarray can’t auto-parse. You’ll see this kind of one-off fix often when working with real scientific datasets.
Reference: OPeNDAP is widely supported by NetCDF tools (xarray, the
netCDF4library, ncview, etc.). Most major climate data providers (NOAA, NASA, ECMWF, IRI, …) serve their datasets over OPeNDAP.
3. A file from Zenodo by DOI — pooch#
Sometimes you need to download the actual file — for example, to use it with a tool that doesn’t speak HTTP, or to work offline. The Pooch library is the recommended tool for this — it caches the file locally, checks it against a hash to detect corruption, and re-uses the cached copy on later runs.
The interesting case: pulling a file from a Zenodo dataset using its DOI. This is the FAIR-canonical way to access a published dataset.
Try it
In a code cell, run:
import pooch
import pandas as pd
doi = "doi:10.5281/zenodo.5739406"
fname = "wind_po_hrly.csv"
file_path = pooch.retrieve(
url=f"{doi}/{fname}",
known_hash="md5:cf059b73d6831282c5580776ac07309a",
)
pd.read_csv(file_path).head()
The first run downloads the file from Zenodo and saves it to a local cache. Later runs reuse the cached copy (and verify it hasn’t been corrupted). Notice the DOI in the URL — the dataset is reproducibly addressable by its DOI, not just an arbitrary URL.
Reference: Pooch supports many remote-data patterns beyond DOIs (plain HTTP URLs, S3 buckets, FTP, etc.) and is the standard download manager in many scientific Python packages. See its documentation for details.
Recap#
You’ve now seen three styles of data access:
Pattern |
Use it for |
Python tool |
|---|---|---|
|
Small public CSVs over HTTP |
|
|
Large gridded scientific data (NetCDF) over the network |
|
|
Downloading specific files (e.g., by DOI from Zenodo) |
|
Most real workflows mix and match — you might use OPeNDAP to inspect a dataset, then Pooch to download a specific subset you need offline.
Where else to find data#
The three patterns above cover most situations you’ll meet in this course, but the data-access landscape has been changing fast. A lot of newer climate datasets are now hosted on cloud object storage (S3, GCS, Azure) rather than traditional HTTP or OPeNDAP servers. The cloud-native equivalent of NetCDF + OPeNDAP is Zarr stored on a cloud bucket, accessed with xarray.open_zarr(...) (with fsspec doing the network plumbing).
You don’t need to use any of these for the course, but they’re worth knowing about — especially when you’re looking for project data:
Earthmover Marketplace — curated cloud-hosted climate datasets in Zarr / Icechunk format, designed for fast analysis-ready access.
LEAP Pangeo Catalog — datasets curated by the NSF LEAP STC (the same group that runs our course JupyterHub); often already on the hub for low-latency access.
Microsoft Planetary Computer — large catalog of satellite imagery and climate datasets hosted on Azure, indexed via the STAC spec.
NASA
earthaccess— Python package that handles auth + S3 access for NASA’s Earthdata Cloud.
When you start looking for data for your final project, browsing these catalogs is often the fastest way to find something good — each comes with its own setup (a Python package, sometimes an account).