---
title: Normalize data with notebooks
description: Learn how to create a notebook that normalizes or cleans data to make it easier to work with.
url: https://docs.influxdata.com/influxdb/v2/tools/notebooks/clean-data/
estimated_tokens: 1167
product: InfluxDB OSS v2
version: v2
publisher: InfluxData
canonical: https://docs.influxdata.com/influxdb/v2/tools/notebooks/clean-data/
date: '2025-04-02T15:54:32-06:00'
lastmod: '2025-04-02T15:54:32-06:00'
---

This page documents an earlier version of InfluxDB OSS.[InfluxDB 3 Core](/influxdb3/core/) is the latest stable version.

#### API token hashing is enabled by default in InfluxDB OSS 2.9.0

Stronger token security: tokens are stored as hashes on disk, so a
copy of the database file doesn’t expose usable tokens. Existing
tokens are hashed on first startup and the original strings can’t
be recovered afterward — **capture any plaintext tokens you still
need before you upgrade**.

For more information, see [Token hashing](/influxdb/v2/admin/tokens/#token-hashing).

Learn how to create a notebook that normalizes data.
Data normalization is the process of modifying or cleaning data to make it easier to
work with. Examples include adjusting numeric values to a uniform scale and modifying strings.

Walk through the following example to create a notebook that queries[NOAA NDBC sample data](/influxdb/v2/reference/sample-data/#noaa-ndbc-data),
normalizes degree-based wind directions to cardinal directions, and then writes
the normalized data to a bucket.

1. [Create a new notebook](/influxdb/v2/tools/notebooks/create-notebook/).

2. In the **Build a Query** cell:

   1. In the **FROM** column under **Sample**,
      select **NOAA National Buoy Data**.
   2. In the next **FILTER** column, select **\_measurement** from the drop-down list
      and select the **ndbc** measurement in the list of measurements.
   3. In the next **FILTER** column, select **\_field** from the drop-down list,
      and select the **wind\_dir\_degt** field from the list of fields.

3. Click  after your **Build a Query** cell to
   add a new cell and select **Flux Script**.

4. In the Flux script cell:

   1. Define a custom function (`cardinalDir()`) that converts a numeric degree
      value to a cardinal direction (N, NNE, NE, etc.).

   2. Use `__PREVIOUS_RESULT__` to load the output of the previous notebook
      cell into the Flux script.

   3. Use [`map()`](/flux/v0/stdlib/universe/map/) to iterate
      over each input row, update the field key to `wind_dir_cardinal`, and
      normalize the `_value` column to a cardinal direction using the custom`cardinalDir()` function.

   4. Use [`to()`](/flux/v0/stdlib/influxdata/influxdb/to/)to write the normalized data back to InfluxDB.
      Specify an existing bucket to write to or[create a new bucket](/influxdb/v2/admin/buckets/create-bucket/).

      ```
      import "array"

      cardinalDir = (d) => {
          _cardinal = if d >= 348.7 or d < 11.25 then "N"
          else if d >= 11.25 and d < 33.75 then "NNE"
          else if d >= 33.75 and d < 56.25 then "NE"
          else if d >= 56.25 and d < 78.75 then "ENE"
          else if d >= 78.75 and d < 101.25 then "E"
          else if d >= 101.25 and d < 123.75 then "ESE"
          else if d >= 123.75 and d < 146.25 then "SE"
          else if d >= 146.25 and d < 168.75 then "SSE"
          else if d >= 168.75 and d < 191.25 then "S"
          else if d >= 191.25 and d < 213.75 then "SSW"
          else if d >= 213.75 and d < 236.25 then "SW"
          else if d >= 236.25 and d < 258.75 then "WSW"
          else if d >= 258.75 and d < 281.25 then "W"
          else if d >= 281.25 and d < 303.75 then "WNW"
          else if d >= 303.75 and d < 326.25 then "NW"
          else if d >= 326.25 and d < 348.75 then "NNW"
          else ""

          return _cardinal
      }

      __PREVIOUS_RESULT__
          |> map(fn: (r) => ({r with
              _field: "wind_dir_cardinal",
              _value: cardinalDir(d: r._value),
          }))
          |> to(bucket: "example-bucket")
      ```

5. Click  after your **Flux Script** cell to
   add a new cell and select **Output to Bucket**.
   Select a bucket from the  **Choose a bucket**drop-down list.

6. *(Optional)* Click  and select **Note** to
   add a cell containing notes about what this notebook does. For example, the
   cell might say, “This notebook converts decimal degree wind direction values
   to cardinal directions.”

7. Click **Preview** in the upper left to verify that your
   notebook runs and previews the output.

8. Click **Run** to run the notebook and write the normalized data to your bucket.

## Continuously run a notebook

To continuously run your notebook, export the notebook as a task:

1. Click  to add a new cell and then select**Task**.

2. Provide the following:

   * **Every**: Interval that the task should run at.
   * **Offset**: *(Optional)* Time to wait after the defined interval to execute the task.
     This allows the task to capture late-arriving data.

3. Click  **Export as Task**.

[notebooks](/influxdb/v2/tags/notebooks/)
