Skip to main content

Merged Interplanetary Data from L1

Python client for the MIDL solar wind dataset.

Install

pip install csem-midl

Quickstart

import midl

data = midl.load("2005-01-01 00:00", "2005-01-01 01:00", 32)
print(data)
<xarray.Dataset> Size: 4kB
Dimensions:  (time: 61)
Coordinates:
  * time     (time) datetime64[ns] 488B 2005-01-01 ... 2005-01-01T01:00:00
Data variables:
    Bx       (time) float64 488B -6.05 -3.94 -3.7 -3.75 ... -2.01 -1.78 -2.08
    By       (time) float64 488B 3.84 3.5 3.12 2.94 3.2 ... 4.97 5.3 5.29 5.2
    Bz       (time) float64 488B -0.93 -4.06 -4.83 -4.92 ... 1.25 2.04 2.05 2.11
    Ux       (time) float64 488B -422.3 -429.9 -433.6 ... -437.4 -441.8 -441.8
    Uy       (time) float64 488B -13.38 -12.91 -9.05 ... -28.15 -27.06 -26.68
    Uz       (time) float64 488B 26.93 47.59 54.86 54.99 ... 0.46 1.42 0.92
    rho      (time) float64 488B 5.169 5.439 5.481 5.359 ... 6.131 6.363 6.323
    T        (time) float64 488B 1.33e+05 1.321e+05 ... 1.159e+05 1.159e+05
Attributes:
    source:             MIDL
    url:                https://csem.engin.umich.edu/MIDL/
    target:             32Re
    midl_propagation:   {'method': 'ballistic', 'target_re': 32.0}
# 14Re and 32Re Ballistically-propagated data are available for direct download
midl.load("2024-05-10 00:00", "2024-05-11 01:00", 14, method="ballistic")
midl.load("2024-05-10 00:00", "2024-05-11 01:00", 32, method="ballistic") 

# [-70,70]Re MHD-propagated data are available for direct download
midl.load("2024-05-10 00:00", "2024-05-11 01:00", 30, method="mhd")

# Any value can be ballistically propagated client-side
midl.load("2024-05-10 00:00", "2024-05-11 01:00", 20.25, method="ballistic") 

# Data at L1 can be downloaded directly as well 
midl.load("2024-05-10 00:00", "2024-05-11 01:00", "L1")

Client-side MHD propagation is not supported.

Coordinate systems

MIDL data is native GSM. Pass coords="GSE" or coords="SM" (case-insensitive, default "GSM") to receive the vector variables (Bx, By, Bz, Ux, Uy, Uz) rotated into that frame, minute by minute:

midl.load("2024-05-10 00:00", "2024-05-11 01:00", 32, coords="GSE")
midl.load("2024-05-10 00:00", "2024-05-11 01:00", "L1", coords="SM")

Scalars (rho, T) and source columns are untouched, and the L1 X variable always remains the reference satellite X_GSM position regardless of coords. The rotation conventions and the published per-minute angle tables they use are documented at https://csem.engin.umich.edu/MIDL/format.html.

Earth orbital motion

Following the community convention (CDAWeb, OMNI, and the instrument teams' own L2 products), the underlying MIDL data have Earth's orbital motion around the Sun removed: the axes are GSE/GSM but the frame origin does not co-move with Earth, so Vy_GSE averages ~0 instead of the ~+29.78 km/s aberration a true Earth-rest frame would show. Since v1.1.1 load() restores it by default, returning velocities in Earth's rest frame — the physically correct upstream input for Earth-centered magnetosphere models such as SWMF. Pass orbital_motion=False for convention-frame (CDAWeb/OMNI-comparable) velocities:

midl.load("2024-05-10", "2024-05-11", "L1", coords="GSE", orbital_motion=False)

The correction is seasonally exact (two-body solution, tangential 29.29–30.29 km/s across the year, added along +Y_GSE) and is expressed in whatever coords frame you request — in GSM it lands in both Uy and Uz through the per-minute rotation angles. Ux is left as-is (the convention is only known to remove the tangential component, so Earth's ±0.50 km/s radial speed is not re-added); B, rho, and T are frame-origin-independent. The choice is recorded in ds.attrs["orbital_motion"], and to_dat headers state it as Earth orbital motion included or Earth orbital motion EXCLUDED.

Saving to file:

midl.to_csv(data, "storm.csv")
midl.to_dat(data, "storm.dat")

Data is cached locally after the first download.

Using with spacepy

MIDL Datasets convert to a spacepy SpaceData in a few lines:

import midl
from spacepy.datamodel import SpaceData, dmarray

ds = midl.load("2005-01-01 00:00", "2005-01-01 01:00", 32)

sd = SpaceData(attrs=dict(ds.attrs))
sd["Epoch"] = dmarray(ds["time"].values, attrs={"units": "UTC"})
for name, da in ds.data_vars.items():
    sd[name] = dmarray(da.values, attrs=dict(da.attrs))

Tutorials

  • Merging MIDL with IMP-8 — merge MIDL L1 with external satellite data to fill gaps in the 1998–2004 ACE-only era

See also

  • MIDL-Pipeline — the code that produces the MIDL dataset
  • MSWIM2D — 2-D MHD solar wind model (1–75 AU) driven by MIDL L1 data; Python client mswim2d

Metadata

Release files for csem-midl 1.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for csem-midl 1.1.1
File Size Uploaded
csem_midl-1.1.1.tar.gz 7.7 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for csem-midl 1.1.1
File Interpreter ABI Platform
csem_midl-1.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 7.8 MB

Release files / csem_midl-1.1.1.tar.gz

Download URL csem_midl-1.1.1.tar.gz
Size 7.7 MB
Tags Source
SHA-256 checksum
How to use checksums
e804d0c223ac9ff8f7730a77b97e40d19e2cb11e56b9dd2d4ad4932018c05d70
BLAKE2b-256 checksum
How to use checksums
c09c1099c6d66fd81377976655b2074c7e4a5f8a77778482714a22663216ccc9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 1, 2026.

Transparency log

Release files / csem_midl-1.1.1-py3-none-any.whl

Download URL csem_midl-1.1.1-py3-none-any.whl
Size 29.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
30c111c0c316f08fe498de76dd276114684d41d18f9962c9e0bcabd378979bc8
BLAKE2b-256 checksum
How to use checksums
bfd3465ce4a883e2729646e7ff56628780a7aa784616a79e429638d681fc4f7b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 1, 2026.

Transparency log

Release history Release notifications | RSS feed

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

This release

1.1.1 This release

2 release files

1.1.0

2 release files

1.0.2

2 release files

1.0.1

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page