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 Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

omfiles-1.1.1-cp310-abi3-win_arm64.whl (982.7 kB view details)

Uploaded CPython 3.10+Windows ARM64

omfiles-1.1.1-cp310-abi3-win_amd64.whl (802.8 kB view details)

Uploaded CPython 3.10+Windows x86-64

omfiles-1.1.1-cp310-abi3-musllinux_1_2_x86_64.whl (1.2 MB view details)

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

omfiles-1.1.1-cp310-abi3-manylinux_2_34_x86_64.whl (13.3 MB view details)

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

omfiles-1.1.1-cp310-abi3-manylinux_2_28_x86_64.whl (1.0 MB view details)

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

omfiles-1.1.1-cp310-abi3-manylinux_2_28_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

omfiles-1.1.1-cp310-abi3-macosx_11_0_arm64.whl (957.6 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

omfiles-1.1.1-cp310-abi3-macosx_10_12_x86_64.whl (974.5 kB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: omfiles-1.1.1-cp310-abi3-win_arm64.whl
  • Upload date:
  • Size: 982.7 kB
  • Tags: CPython 3.10+, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: maturin/1.12.3

File hashes

Hashes for omfiles-1.1.1-cp310-abi3-win_arm64.whl
Algorithm Hash digest
SHA256 5abfcfd8be65bb33dd92b49e9d92cfa940f9dfaaa7a6ecb365f7a7356b5e953b
MD5 c8d4a94a7652f5ae88fca7dbbbe293c0
BLAKE2b-256 c9996665bacf5c6af506d95ccb979f40d58212b9fe814fe6357a3926de8d84d4

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for omfiles-1.1.1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 cc5571193a862a0e0fc6f916f5cc9bf838da04fbc96545d7c2aa3b10004abe9d
MD5 2e34f49aa47fe97c887a49a580242266
BLAKE2b-256 1dbe00cadde07baafe978e6b77aa0ec00eb9eb3398fb4aad20b1e652b59864cd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for omfiles-1.1.1-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9110f4de6f739cc6b645b92b51705397721e4dd1ee85d9c36e2b984c0611d4ff
MD5 52f445160f9c193253d5dd1f90d43c76
BLAKE2b-256 0a4577b3495a007b22c6413156320019a19b1f56b93ae11a64844e5d0832088b

See more details on using hashes here.

File details

Details for the file omfiles-1.1.1-cp310-abi3-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for omfiles-1.1.1-cp310-abi3-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 8cd82ac5ae9691bcd64ea2c646360f5df730d842b13f8107f1cc42d05b34e9e1
MD5 bd1bd07bda9df6da7a078ea0704d6559
BLAKE2b-256 8399dccb1c8228b98d85765734d6b0e17f4ac3117696f782c98a3a4a43b99af2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for omfiles-1.1.1-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 37feeaf62703446c4f476d0d0f64cc30c4554654abf64bb72bf628252fc0b345
MD5 70c18771dc06ea6b93071709581f9983
BLAKE2b-256 e5281b735aebaf6438a2b24dea085261939fa66d8b35400528de9a8faa2c7713

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for omfiles-1.1.1-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7a5079a01e1645d36573c19f50364664eeccb85002f6de42fd98483315454c8f
MD5 506576b349b89b3cba51435cc97f7107
BLAKE2b-256 f4536a54da90619e94435fae0acee26719ba3686958a1cec4937b60e93d782aa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for omfiles-1.1.1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 44054baa47bec2a15ff579302d6bb0c7b9700c6c26bb2ed6f6abf5cf8086bbd6
MD5 c8fa67427e24fd138a04d85b4794c0cc
BLAKE2b-256 734a2e467ccd75517ec75e0db77172680707f0d23451a408e0300b2d716e3482

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for omfiles-1.1.1-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 ab2e1d4533b8dd5a981769269cd433fdc6072906deb18621e5899b15e279b37e
MD5 66703227a4f06b48e45ab9fb443b9efa
BLAKE2b-256 14fbb8be21006f5aa3bdd1f43244f82e489a0a24c2c7b6ebc6cf2b980e6915ca

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