---
myst:
html_meta:
description: "Export an asset's channel data to CSV or Parquet with the nom download wizard."
---
# Download data
{.lead}
`nom download` asks for an asset, a dataset, channels and a time range, then saves the channel data as CSV or Parquet files.
It exports samples, not the files that were uploaded.
You need a profile from [API keys setup](/guides/api-keys-setup.md).
To export from Python, or download the uploaded files, see [Export data](/guides/datasets/export-data.md).
## Run the wizard
```bash
nom download --profile default # Parquet
nom download --profile default --format csv
```
The wizard asks for:
1. **An asset**, newest first.
1. **A dataset** on that asset, listed with its data scope name. An asset with one dataset skips this step.
1. **Channels**, as comma-separated text to match, such as `RPM, TEMP`, or `*` for all.
Matching is case-insensitive and finds the text anywhere in a name.
You can then remove channels in an editor, but not add them. To add channels, decline the selection and search again.
1. **An output folder**, created if needed. Use a new folder for each export, because files from an earlier export can be overwritten or left behind.
1. **A time range** from an event, a run or timestamps you enter.
Use UTC timestamps ending in `Z`, such as `2026-09-10T14:00:00Z`.
For a run that's still going, the suggested end is your local time read as UTC, so replace it unless your machine uses UTC.
Choosing a run or event sets only the time range, not the asset, dataset or channels.
The export applies the data scope's tags, but not its time offset.
## The output
Files are named after the end of the dataset's RID, such as `abc123-part_0.parquet`. Each covers a slice of time.
- The `timestamp` column holds epoch seconds as floats, so it can't represent every nanosecond.
- Channels sampled at different times have nulls where they don't line up.
- `DOUBLE`, `INT` and `STRING` channels are exported. Others are skipped with a warning.
- Batches that fail are logged and skipped, so check the warnings and the time coverage.
To combine the parts in Python:
```python
from pathlib import Path
import polars as pl
parts = sorted(Path("flight_data").glob("abc123-part_*.parquet"))
data = pl.concat([pl.read_parquet(p) for p in parts], how="diagonal_relaxed").sort("timestamp")
```
`diagonal_relaxed` fills columns missing from some parts with nulls.
In MATLAB, read Parquet parts with `parquetread` and CSV parts with `readtable`, and convert timestamps with `datetime(t, "ConvertFrom", "posixtime", "TimeZone", "UTC")`.
## Tune large downloads
| Option | Default | Effect |
| --- | --- | --- |
| `--channels-per-request` | `10` | Channels per request. Raise it for many low-rate channels, lower it to spread a few channels across workers. |
| `--points-per-file` | `25000000` | Target points per file. Lower it to use less memory per part. |
Change one option at a time on a short range, into a new folder each time.
Selecting fewer channels or a shorter range helps most.
If the wizard finds no assets, check the profile's workspace with `nom config profile list`.
For a dataset that isn't on an asset, [export it from Python](/guides/datasets/export-data.md).