Skip to main content

Python bindings for the Open-Meteo file format

Project description

Python Bindings for Open Meteo File Format

Python 3.10 | 3.11 | 3.12 | 3.13 | 3.14 PyPI version Build and Test

Features

  • Read Open-Meteo (.om) files directly from cloud storage using Python
  • Traverse the hierarchical data structure
  • Arrays/array slices are returned directly as NumPy arrays
  • Support for fsspec and xarray
  • Chunked data access behind the scenes

Installation

pip install omfiles

Pre-Built Wheels & Platform Support

We provide pre-built wheels for the following platforms:

  • Linux x86_64 (manylinux_2_28_x86_64)
  • Linux aarch64 (manylinux_2_28_aarch64)
  • Linux musl x86_64 (musllinux_1_2_x86_64)
  • Windows x86_64 (win_amd64)
  • Windows ARM64 (win_arm64)
  • macOS x86_64 (macosx_10_12_x86_64)
  • macOS ARM64 (macosx_11_0_arm64)

Reading

Reading Files without Hierarchy

OM files are structured like a tree of variables. The following example assumes that the file test_file.om contains an array variable as a root variable which has a dimensionality greater than 2 and a size of at least 2x100:

from omfiles import OmFileReader

reader = OmFileReader("test_file.om")
data = reader[0:2, 0:100, ...]
reader.close() # Close the reader to release resources

Reading Hierarchical Files, e.g. S3 Spatial Files

import datetime as dt

import fsspec
import numpy as np
from omfiles import OmFileReader

# Example: URI for a spatial data file in the `data_spatial` S3 bucket
# See data organization details: https://github.com/open-meteo/open-data?tab=readme-ov-file#data-organization
MODEL_DOMAIN = "dwd_icon"
# Note: Spatial data is only retained for 7 days. The script uses one file within this period.
date_time = dt.datetime.now(dt.timezone.utc) - dt.timedelta(days=2)
S3_URI = (
    f"s3://openmeteo/data_spatial/{MODEL_DOMAIN}/{date_time.year}/"
    f"{date_time.month:02}/{date_time.day:02}/0000Z/"
    f"{date_time.strftime('%Y-%m-%d')}T0000.om"
)
print(f"Using om file: {S3_URI}")

# Create and open filesystem, wrapping it in a blockcache
backend = fsspec.open(
    f"blockcache::{S3_URI}",
    mode="rb",
    s3={"anon": True, "default_block_size": 65536},  # s3 settings
    blockcache={"cache_storage": "cache"},  # blockcache settings
)
# Create reader from the fsspec file object using a context manager.
# This will automatically close the file when the block is exited.
with OmFileReader(backend) as root:
    # We are at the root of the data hierarchy!
    # What type of node is this?
    print(f"root.is_array: {root.is_array}")  # False
    print(f"root.is_scalar: {root.is_scalar}")  # False
    print(f"root.is_group: {root.is_group}")  # True

    temperature_reader = root.get_child_by_name("temperature_2m")
    print(f"temperature_reader.is_array: {temperature_reader.is_array}")  # True
    print(f"temperature_reader.is_scalar: {temperature_reader.is_scalar}")  # False
    print(f"temperature_reader.is_group: {temperature_reader.is_group}")  # False

    # What shape does the stored array have?
    print(f"temperature_reader.shape: {temperature_reader.shape}")  # (1441, 2879)

    # Read all data from the array
    temperature_data = temperature_reader.read_array((...))
    print(f"temperature_data.shape: {temperature_data.shape}")  # (1441, 2879)

    # It's also possible to read any subset of the array
    temperature_data_subset1 = temperature_reader.read_array((slice(0, 10), slice(0, 10)))
    print(temperature_data_subset1)
    print(f"temperature_data_subset1.shape: {temperature_data_subset1.shape}")  # (10, 10)

    # Numpy basic indexing is supported for direct access if the reader is an array.
    temperature_data_subset2 = temperature_reader[0:10, 0:10]
    print(temperature_data_subset2)
    print(f"temperature_data_subset2.shape: {temperature_data_subset2.shape}")  # (10, 10)

    # Compare the two temperature subsets and verify that they are the same
    are_equal = np.array_equal(temperature_data_subset1, temperature_data_subset2, equal_nan=True)
    print(f"Are the two temperature subsets equal? {are_equal}")

Writing

Single Array

import numpy as np
from omfiles import OmFileWriter

# Create sample data
data = np.random.rand(100, 100).astype(np.float32)

# Initialize writer
writer = OmFileWriter("simple.om")

# Write array with compression
array_variable = writer.write_array(
    data,
    chunks=[50, 50],
    scale_factor=1.0,
    add_offset=0.0,
    compression="pfor_delta_2d",
    name="data"
)

# Finalize the file using array_variable as entry-point
writer.close(array_variable)

Hierarchical Structure

import numpy as np
from omfiles import OmFileWriter

# Create sample data
features = np.random.rand(1000, 64).astype(np.float32)
labels = np.random.randint(0, 10, size=(1000,), dtype=np.int32)

# Initialize writer
writer = OmFileWriter("hierarchical.om")

# Write child arrays first
features_var = writer.write_array(features, chunks=[100, 64], name="features", compression="pfor_delta_2d")
labels_var = writer.write_array(labels, chunks=[100], name="labels")
metadata_var = writer.write_scalar(42, name="metadata")

# Create root group with children
root_var = writer.write_group(
    name="root",
    children=[features_var, labels_var, metadata_var],
)
# Finalize the file using root_var as entry-point into the hierarchy
writer.close(root_var)

Examples

There are some examples how to use this library in examples/. They should be run as uv scripts to automatically setup the correct python environment.

uv run examples/plot_map.py

Development

# install the required dependencies in .venv directory
uv sync
# to run the tests
uv run pytest tests/
# to build the wheels
uv run build
# or to trigger maturin directly:
# maturin develop

Tests

cargo test

runs rust tests.

uv run pytest tests/

runs Python tests.

Python Type Stubs

Can be generated from the rust doc comments via

cargo run stub_gen

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

omfiles-1.2.0.tar.gz (250.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

omfiles-1.2.0-cp310-abi3-win_arm64.whl (1.1 MB view details)

Uploaded CPython 3.10+Windows ARM64

omfiles-1.2.0-cp310-abi3-win_amd64.whl (869.6 kB view details)

Uploaded CPython 3.10+Windows x86-64

omfiles-1.2.0-cp310-abi3-musllinux_1_2_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ x86-64

omfiles-1.2.0-cp310-abi3-manylinux_2_28_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ x86-64

omfiles-1.2.0-cp310-abi3-manylinux_2_28_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

omfiles-1.2.0-cp310-abi3-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

omfiles-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl (1.0 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file omfiles-1.2.0.tar.gz.

File metadata

  • Download URL: omfiles-1.2.0.tar.gz
  • Upload date:
  • Size: 250.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.13.1

File hashes

Hashes for omfiles-1.2.0.tar.gz
Algorithm Hash digest
SHA256 ca42ebb260de73e937cb4a72d1867e34e7046f19105202c01d1455c72abf6895
MD5 3cd2abc9627267d776230c2a0feba622
BLAKE2b-256 df43a8937afc980168ff1aef7350dafac7ce460592dc4f115bc2135c60fdc001

See more details on using hashes here.

File details

Details for the file omfiles-1.2.0-cp310-abi3-win_arm64.whl.

File metadata

  • Download URL: omfiles-1.2.0-cp310-abi3-win_arm64.whl
  • Upload date:
  • Size: 1.1 MB
  • Tags: CPython 3.10+, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.13.1

File hashes

Hashes for omfiles-1.2.0-cp310-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 fd242b62d18923ed338e2a59419564d5b41a28438d8dd284e3f95eb9b59824ff
MD5 d2f2eaa52a298ff2b89ad8c9d2f20c33
BLAKE2b-256 493ec32b9a7214eddea39e99a1ee78af67d796b544abd4354f3296022901a037

See more details on using hashes here.

File details

Details for the file omfiles-1.2.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: omfiles-1.2.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 869.6 kB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.13.1

File hashes

Hashes for omfiles-1.2.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 fa81ae39c643e80246abdcef370e89d187d64511ba6cd72d4a88a2dc4f1ecb44
MD5 16a8208bfb41ba843c171f6c90205bfc
BLAKE2b-256 0b5b2f1b892c3764e71aaf9c7d5698bb3cc630d01d79c1632bf442ad8536fb32

See more details on using hashes here.

File details

Details for the file omfiles-1.2.0-cp310-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for omfiles-1.2.0-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0d5754fdd07ce93e19e4302129963abb35257d04ed51b5fc4bfd89ee40d88b70
MD5 c1bf94bcb21269a5b00fde51740d752f
BLAKE2b-256 ad11c9e9027fa32877f892567dc4eeffd3a4eb7e61ad24e28fd4bc5f76237827

See more details on using hashes here.

File details

Details for the file omfiles-1.2.0-cp310-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for omfiles-1.2.0-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 525082edbf7d583d0215b9930debcea3addd1cb99144b610a5f00191a1191d39
MD5 4fd69e40bc8ad22f96a56689f28de7b9
BLAKE2b-256 8af2d64d9f3424ccbcc94850fcaca04de05d1dd7db8d1c5bbfda63ee37159c3e

See more details on using hashes here.

File details

Details for the file omfiles-1.2.0-cp310-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for omfiles-1.2.0-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bb40290c7661978490ae43ec156ab0a14ccb2311f81d74ff7c5067c04094195e
MD5 e7d7d607cedd5da123a41e4fad847780
BLAKE2b-256 8f7844f3f9cfc4bdd13af9992386b538ca4ad0eeb3f22e692814ace004c8924e

See more details on using hashes here.

File details

Details for the file omfiles-1.2.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for omfiles-1.2.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 05a04d1d3c3530954d81e471335053fdc5331d52323c332c66b99f1855a7871d
MD5 0b100817f300bcfc0b8fe42b39b80bd3
BLAKE2b-256 861bc3f65a2c6bb5f1c236af66cb77acbd185ee657181cebb19398cbcc84c9e7

See more details on using hashes here.

File details

Details for the file omfiles-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for omfiles-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 4298616241141234c53a1815f5f07b7262d1b3261f8fd73671cb7b62a28b914d
MD5 68d10f6aad593cd0e3cbbf5dbcdb2b1d
BLAKE2b-256 61966f7f6036718779761fa00ccc11358ed1bc03a162e9dbd2fc4fd1d3de5800

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page