TimeDataModel
A lightweight Pythonic data model for time series data, interoperable with NumPy, Pandas and Polars.
TimeDataModel is a metadata-rich container for time series data. It lets you carry your data and its context — name, unit, frequency, timezone — as a single, self-describing object, fully interoperable with pandas, NumPy, Polars, and PyArrow.
⬇️ Installation | 📖 Documentation | 🚀 Examples
🧱 Core Data Classes
| Class | Description |
|---|---|
📈 TimeSeries |
Univariate time series supporting four temporal shapes; the underlying DataFrame is optional, so the same class also serves as a metadata-only descriptor for catalog/registration use |
🔷 DataShape |
Enum that selects which timestamp columns are present: SIMPLE, VERSIONED, CORRECTED, or AUDIT |
⏱️ Frequency |
ISO 8601 duration-based frequencies (PT1H, P1D, P1M, …) |
🏷️ DataType |
Hierarchical taxonomy: ACTUAL → OBSERVATION, DERIVED; CALCULATED → FORECAST, SIMULATION, … |
🗺️ GeoLocation / GeoArea |
Geographic point and polygon types with distance, bearing, and containment |
📐 Data Shapes
TimeSeries supports four temporal shapes to model everything from simple point-in-time
data to full audit trails:
| Shape | Columns | Use case |
|---|---|---|
SIMPLE |
valid_time, value |
Standard time series |
VERSIONED |
knowledge_time, valid_time, value |
Track when each value was produced |
CORRECTED |
valid_time, change_time, value |
Corrections: track when a value was revised |
AUDIT |
knowledge_time, change_time, valid_time, value |
Full audit trail |
🚀 Quick Start
import pandas as pd
from timedatamodel import TimeSeries, Frequency
# --- Univariate series from a pandas DataFrame ---
df = pd.DataFrame({
"valid_time": pd.date_range("2024-01-01", periods=24, freq="h", tz="UTC"),
"value": [100.0 + i * 2.5 for i in range(24)],
})
ts = TimeSeries.from_pandas(
df,
frequency=Frequency.PT1H,
name="wind_power",
unit="MW",
)
print(ts)
# TimeSeries ─────────────────────────
# Name wind_power
# Shape SIMPLE
# Rows 24
# Frequency PT1H
# Timezone UTC
# Unit MW
# ──────────────────────────────────────────
# wind_power
# 2024-01-01 00:00 100.0
# 2024-01-01 01:00 102.5
# ...
# --- Unit conversion (requires pint extra) ---
ts_kw = ts.convert_unit("kW")
# --- Format conversions ---
df_pd = ts.to_pandas() # pd.DataFrame with datetime index
df_pl = ts.to_polars() # pl.DataFrame
cols = ts.to_list() # dict[str, list] — column-oriented
arr = ts.to_numpy() # dict[str, np.ndarray] — column-oriented (requires numpy)
tbl = ts.to_pyarrow() # pa.Table (requires pyarrow)
✨ Key Features
- 🔷 Four data shapes — from
SIMPLEpoint-in-time toAUDITfull audit history; - 🏷️ Metadata — name, unit, frequency, timezone, data type, description on every series;
- 📋 Metadata-only mode — construct
TimeSeries(df=None, …)to declare a series' structure before any data exists, for catalog/registration use; - 🔄 Format conversions —
to_pandas,to_polars,to_list,to_numpy,to_pyarrowwith lazy optional-dependency checks; - 📊 Coverage bar —
coverage_bar()renders null coverage as a binned SVG in Jupyter or Unicode blocks in terminal; - 🗺️ Geospatial primitives —
GeoLocationandGeoAreafor use by consumer layers; - 📏 Units — optional pint integration for dimensional unit conversion and validation;
- ⚡ Polars-powered — backed by the Polars compute engine for high-performance in-memory processing;
- 🐍 Type-safe — full type hints with PEP 561 support.
⬇️ Installation
Install the stable release:
pip install timedatamodel
Install with optional dependencies:
pip install timedatamodel[pandas] # pandas interop (includes pyarrow for tz-aware columns)
pip install timedatamodel[pint] # unit conversion
pip install timedatamodel[geo] # geospatial support (shapely)
pip install timedatamodel[all] # all optional extras
Install in editable mode for development:
git clone https://github.com/rebase-energy/timedatamodel.git
cd TimeDataModel
pip install -e .[dev]
🤝 Contributing
Contributions are welcome! Here are some ways to contribute to TimeDataModel:
- Propose new features or extend existing classes;
- Improve documentation or add example notebooks;
- Report bugs or suggest features via GitHub Issues.
📄 Licence
This project uses the MIT Licence.
Metadata
Release files for timedatamodel 0.12.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| timedatamodel-0.12.0.tar.gz | 43.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| timedatamodel-0.12.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 74.2 kB
Release files / timedatamodel-0.12.0.tar.gz
| Download URL | timedatamodel-0.12.0.tar.gz |
|---|---|
| Size | 43.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
44a08545b8ad2b8fd488da12654adebeddf362fd3abacec09528416f782d19b8
|
|
BLAKE2b-256 checksum How to use checksums |
c5aa981f4dc69966c979441049555f1344a2cc5db6abd1b33aeacd5d7e5d9eeb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 28, 2026.
Transparency logRelease files / timedatamodel-0.12.0-py3-none-any.whl
| Download URL | timedatamodel-0.12.0-py3-none-any.whl |
|---|---|
| Size | 30.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e0e03549d1c00c978356f724c61f79b88d277524cf137b1acd18b51d458e2531
|
|
BLAKE2b-256 checksum How to use checksums |
85bafb84e45e4720da6661bd9eec169d0e02fe3ea1ca8881089f620159c2f4f6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 28, 2026.
Transparency log