db-eplusout-reader
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
parquetextra) - Zero runtime dependencies (the
parquetextra addspyarrow)
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)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| db_eplusout_reader-0.6.0.tar.gz | 920.1 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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 logSecurity 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.
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 logA 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.