# CSV and Parquet

Nominal reads CSV and Parquet files with one timestamp column. Every other column becomes a channel. CSV files must use commas between values and periods for decimals, such as `3.14`.

## Upload a file

**Nominal app**

1. In the sidebar, click **+** (**New**), then **Upload data**. Drop the file onto **Upload files**, or click **SELECT FILES**.
2. Click **SELECT A DESTINATION** and choose **Standalone dataset**. Pick a dataset, or click **NEW DATASET**, enter a name and click **CREATE DATASET**.
3. In the **Settings** panel, check the **Timestamp column** and **Timestamp format** against your file.
4. Click **CONFIRM & INGEST**.

**Python**

```python
from nominal.core import NominalClient

client = NominalClient.from_profile("default")
dataset = client.create_dataset("Flight telemetry")
file = dataset.add_tabular_data(
    "flight.csv",
    timestamp_column="time",
    timestamp_type="iso_8601",
)
file.poll_until_ingestion_completed()  # raises if ingestion fails
```

The Python client’s [CSV and Parquet](https://dev.nominal.io/python/guides/datasets/csv.md#timestamp-formats) guide lists every `timestamp_type`.

**nomctl**

```bash
nomctl ingest csv --name "Flight telemetry" \
  --timestamp-column time --timestamp-type iso8601 flight.csv
```

For a Parquet file, use [`nomctl ingest parquet`](https://dev.nominal.io/nomctl/commands/ingest.md#nomctl-ingest-parquet) with the same options.

## Options

| Setting | Nominal app | Python | nomctl |
| --- | --- | --- | --- |
| Timestamp column | **Timestamp column** | `timestamp_column` | `--timestamp-column` |
| Timestamp format, such as ISO 8601 or epoch seconds | **Timestamp format** | `timestamp_type` | `--timestamp-type`, with `--relative-to` for times since a start |
| A tag on every row | **Tags** | `tags` | `--file-tag` |
| A tag read from a column | **Tag columns** | `tag_columns` | `--tag-column` |
| An archive of Parquet files | — | A `.parquet.tar`, `.parquet.tar.gz` or `.parquet.zip` path | `--archive` |
