Skip to main content

db-eplusout-reader

Tests Python

A tool to fetch results from EnergyPlus output files (.sql and .eso formats).

Features

  • Read results from both .sql (SQLite) and .eso (text) EnergyPlus output files
  • Filter variables by key, type, and units
  • Support for exact and substring (alike) matching
  • Filter results by date range
  • Export results to CSV (and optionally Parquet via the parquet extra)
  • Zero runtime dependencies (the parquet extra adds pyarrow)

DesignBuilder Compatibility

DesignBuilder Version Package Version
< v7.2.0.028 0.2.0
>= v7.2.0.028 0.3.x
future release 0.4.0

Installation

From PyPI:

pip install db-eplusout-reader   # or: uv add db-eplusout-reader

DesignBuilder: to update the bundled copy, install into its Python directory:

pip install db-eplusout-reader --target "C:\Program Files\DesignBuilder\Python\Lib"

Usage

Basic Concepts

Variable: A named tuple (key, type, units) that defines which outputs to extract.

from db_eplusout_reader import Variable

# Specific variable
v = Variable(
    key="PEOPLE BLOCK1:ZONE2",
    type="Zone Thermal Comfort Fanger Model PPD",
    units="%"
)

# Use None to match any value for that field
Variable(None, None, None)  # returns all outputs
Variable(None, None, "J")   # returns all outputs with units "J"
Variable(None, "Temperature", None)  # returns all temperature outputs

Frequency: Output interval - one of TS (timestep), H (hourly), D (daily), M (monthly), A (annual), or RP (runperiod).

from db_eplusout_reader.constants import TS, H, D, M, A, RP

Reading SQL Files

For .sql files, use get_results() directly - SQLite handles caching efficiently:

from db_eplusout_reader import Variable, get_results
from db_eplusout_reader.constants import H

results = get_results(
    r"C:\path\to\eplusout.sql",
    variables=[Variable(None, None, "C")],
    frequency=H
)

Reading ESO Files

For .eso files, parse once and query multiple times to avoid re-reading:

from db_eplusout_reader import DBEsoFile, Variable
from db_eplusout_reader.constants import H, D

# Parse the file once
eso = DBEsoFile.from_path(r"C:\path\to\eplusout.eso")

# Query multiple times without re-reading
results_temp = eso.get_results([Variable(None, None, "C")], H)
results_pressure = eso.get_results([Variable(None, None, "Pa")], H)
results_daily = eso.get_results([Variable(None, None, None)], D)

You can also pass the DBEsoFile object to get_results():

results = get_results(eso, variables=[Variable(None, None, "C")], frequency=H)

Filtering Options

Exact vs Substring Matching

# Exact match (default) - key must match exactly
results = get_results(path, variables, frequency=D, alike=False)

# Substring match - partial matches allowed
results = get_results(path, variables, frequency=D, alike=True)
# Variable("BLOCK", None, None) will match "PEOPLE BLOCK1:ZONE2"

Strict Mode

# By default, requested variables that aren't present are silently skipped.
# Pass strict=True to raise VariableNotFound instead.
results = get_results(path, variables, frequency=D, strict=True)

Date Range Filtering

from datetime import datetime

results = get_results(
    path,
    variables=variables,
    frequency=D,
    start_date=datetime(2002, 5, 1, 0),
    end_date=datetime(2002, 5, 31, 23, 59)
)

Working with Results

get_results() returns a ResultsDictionary with useful properties:

results = get_results(path, variables, frequency=M)

# Metadata
results.frequency      # 'monthly'
results.time_series    # [datetime(2013, 1, 1), datetime(2013, 2, 1), ...]

# Access data
results.variables      # List of matched Variable tuples
results.arrays         # List of value arrays (one per variable)
results.first_variable # First matched Variable
results.first_array    # Values for first variable
results.scalar         # First value of first array

# Iterate
for variable, values in results.items():
    print(f"{variable}: {len(values)} values")

Export to CSV

# Basic export
results.to_csv(r"C:\output.csv")

# With options
results.to_csv(
    r"C:\output.csv",
    explode_header=True,  # Split Variable into separate columns
    delimiter=",",        # CSV delimiter
    title="My Results",   # Add title row
    append=True           # Append to existing file
)

Parquet (optional)

Parquet is handy for object-storage workflows. It's an optional extension — install the extra to enable it:

pip install db-eplusout-reader[parquet]
from db_eplusout_reader import get_results, to_parquet, read_parquet

results = get_results(path, variables, frequency=M)

# Write to Parquet (extra kwargs forwarded to pyarrow, e.g. compression)
to_parquet(results, r"C:\output.parquet", compression="snappy")

# Read back into a ResultsDictionary (frequency, variables and time series preserved)
results = read_parquet(r"C:\output.parquet")

Complete Example

from datetime import datetime
from db_eplusout_reader import DBEsoFile, Variable, get_results
from db_eplusout_reader.constants import H, D, M

# Define variables to extract
variables = [
    Variable(None, "Electricity:Facility", "J"),
    Variable("PEOPLE BLOCK1:ZONE1", "Zone Thermal Comfort Fanger Model PMV", ""),
]

# === SQL File ===
sql_results = get_results(
    r"C:\path\to\eplusout.sql",
    variables=variables,
    frequency=M,
    alike=False
)

# === ESO File (parse once, query many) ===
eso = DBEsoFile.from_path(r"C:\path\to\eplusout.eso")

eso_results_monthly = eso.get_results(variables, M)
eso_results_hourly = eso.get_results(variables, H)
eso_results_filtered = eso.get_results(
    variables,
    H,
    start_date=datetime(2019, 1, 1),
    end_date=datetime(2019, 1, 31)
)

# === Work with results ===
print(f"Found {len(sql_results)} variables")
print(f"Time steps: {len(sql_results.time_series)}")
print(f"First variable: {sql_results.first_variable}")
print(f"First 5 values: {sql_results.first_array[:5]}")

# Export
sql_results.to_csv(r"C:\output.csv", explode_header=True)

Development

Setup

This project uses uv for dependency management and ruff for linting/formatting.

# Install dependencies
uv sync --group dev

# Run tests
uv run pytest tests -v

# Run linting
uv run ruff check .
uv run ruff format .

# Run pre-commit hooks
uv run pre-commit run --all-files

Pre-commit Hooks

Install pre-commit hooks for automatic code quality checks:

uv run pre-commit install

License

MIT License - see LICENSE for details.

Metadata

Release files for db-eplusout-reader 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for db-eplusout-reader 0.6.0
File Size Uploaded Provenance
db_eplusout_reader-0.6.0.tar.gz 920.1 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for db-eplusout-reader 0.6.0
File Interpreter ABI Platform
db_eplusout_reader-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 946.9 kB

Release files / db_eplusout_reader-0.6.0.tar.gz

Download URL db_eplusout_reader-0.6.0.tar.gz
Size 920.1 kB
Tags Source
SHA-256 checksum
How to use checksums
488df2ae0057769c345b1b71084d53b38ff56f6b892a5fc5a34824c2f4c70c80
BLAKE2b-256 checksum
How to use checksums
eebcf7583f616656f3a5a3e67291485b955d9721ac6b8336037a700988f63a68
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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 Jul 15, 2026.

Transparency log

Release files / db_eplusout_reader-0.6.0-py3-none-any.whl

Download URL db_eplusout_reader-0.6.0-py3-none-any.whl
Size 26.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a489c6fb096b2b3cd59abb3817ba82ac1b944d754f2c79475e60914b086ad8fb
BLAKE2b-256 checksum
How to use checksums
dd5ade80c8bfafbb5b59d789a6aa5f071e8eb932467bc3bd1919f1a472778870
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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 Jul 15, 2026.

Transparency log

Security for db-eplusout-reader 0.6.0

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for db_eplusout_reader-0.6.0.tar.gz

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 Jul 15, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page