Skip to main content

pythermalcomfort is a comprehensive toolkit for calculating thermal comfort indices, heat/cold stress metrics, and thermophysiological responses. It supports multiple models, including PMV, PPD, adaptive comfort, SET, UTCI, Heat Index, Wind Chill Index, and Humidex. The package also includes thermophysiological models like the two-node (Gagge) and multinode (JOS-3) models to estimate physiological responses such as core temperature, skin temperature, and skin wettedness.

Project description

pythermalcomfort logo

pythermalcomfort

The pythermalcomfort Python package is a comprehensive toolkit for calculating thermal comfort indices, heat/cold stress metrics, and thermophysiological responses based on international standards and peer-reviewed research. Designed for researchers, engineers, and building-science professionals, it simplifies complex calculations while promoting accuracy and standards compliance.

Cite pythermalcomfort

If you use pythermalcomfort in your research, please cite it as follows:

Tartarini, F., Schiavon, S., 2020.
pythermalcomfort: A Python package for thermal comfort research.
SoftwareX 12, 100578.
https://doi.org/10.1016/j.softx.2020.100578

Key Features

  • Thermal Comfort Calculations: Supports multiple models, including PMV, PPD, adaptive comfort, and SET.

  • Heat and Cold Stress Indices: Calculate UTCI, Heat Index, Wind Chill Index, and Humidex.

  • Thermophysiological Models: Includes the two-node (Gagge) and multinode (JOS-3) models to estimate physiological responses such as core temperature, skin temperature, and skin wettedness.

  • Standards Compliance: Implements calculations based on ASHRAE 55, ISO 7730, EN 16798, and more.

  • Ease of Use: Intuitive API for seamless integration into Python projects.

  • Extensive Documentation: Detailed guides, examples, and tutorials.

  • Active Development: Regularly updated with new features, improvements, and bug fixes.

  • Open Source: Licensed under the MIT License.

Why Use pythermalcomfort?

  • Accurate Assessments: Reliable thermal comfort and stress evaluations for diverse environments.

  • Time-Saving: Automates complex calculations, saving time and effort.

  • Versatility: Useful for building science, HVAC design, environmental design, thermal physiology, sports science, and biometeorology.

  • Enhanced Decision-Making: Supports data-driven decisions for HVAC systems, building performance, and occupant comfort.

Installation

Install pythermalcomfort via pip:

pip install pythermalcomfort

For advanced installation options, refer to the Installation Instructions.

Requirements

A typical environment includes:

  • Python 3.9+ (or the minimum version used in CI)

  • NumPy, SciPy, pandas (installed automatically as package dependencies)

  • Optional: Matplotlib / other plotting libraries for examples and visualizations

Quick Start

Get started with pythermalcomfort in just a few lines of code:

from pythermalcomfort.models import pmv_ppd_iso, utci

# Calculate PMV and PPD using ISO 7730 standard
result = pmv_ppd_iso(
    tdb=25,  # Dry Bulb Temperature in °C
    tr=25,  # Mean Radiant Temperature in °C
    vr=0.1,  # Relative air speed in m/s
    rh=50,  # Relative Humidity in %
    met=1.4,  # Metabolic rate in met
    clo=0.5,  # Clothing insulation in clo
    model="7730-2005"  # Year of the ISO standard
)
print(f"PMV: {result.pmv}, PPD: {result.ppd}")

# Calculate UTCI for heat stress assessment
utci_value = utci(tdb=30, tr=30, v=0.5, rh=50)
print(utci_value)

For more examples and detailed usage, check out models and indices in the models section of the documentation.

Support pythermalcomfort

If you find this project useful, consider supporting the maintainers. Maintaining an open-source scientific package requires time for development, review, CI, and user support.

Ways to support

  • Sponsor via GitHub: https://github.com/sponsors/FedericoTartarini

  • Contribute code, tests, or documentation: open a PR against pythermalcomfort

  • Report bugs or request features with a minimal reproduction in issues

  • Help with testing, translations, or reviewing pull requests

  • Star or share the project to increase visibility

Any support—financial or contribution-based—is appreciated and helps keep the project healthy.

Contribute

We welcome contributions! Whether reporting a bug, suggesting a feature, or submitting a pull request, your input helps make pythermalcomfort better for everyone. See the contributing guide for full contribution instructions.

Quick checklist

  • Open an issue first for larger features to discuss scope and design.

  • Fork the repo and create a feature branch for your work.

  • Add tests for new behavior and run the test suite locally.

  • Run linters and formatters and fix reported issues.

  • Update documentation and changelog entries for public API changes.

  • Submit a clear, focused pull request referencing any related issues.

Common commands

# clone your fork and add upstream remote
git clone git@github.com:your-username/pythermalcomfort.git
cd pythermalcomfort
git remote add upstream git@github.com:CenterForTheBuiltEnvironment/pythermalcomfort.git
git fetch upstream

# create a branch and work on it
git checkout -b Feature/awesome-feature

# run the full test matrix (may be slow)
tox

# run a single test env locally (replace py312 with the env you want)
tox -e py312

# run a subset of pytest tests
pytest -k test_name_fragment

# fix linting/formatting
ruff check --fix
ruff format
docformatter --in-place --wrap-summaries 88 --wrap-descriptions 88 pythermalcomfort/*.py

# commit and push
git add .
git commit -m "feat: short description of change"
git push origin Feature/awesome-feature

Where to get help

Documentation

Detailed docs, examples and API references are available at: https://pythermalcomfort.readthedocs.io/en/latest/

License

pythermalcomfort is released under the MIT License.

Stats

Changelog

3.9.0 (2026-02-03)

  • Added sports_heat_stress_risk function to assess heat stress risk for athletes during outdoor sports activities based on environmental conditions. Addresses issue #237.

3.7.0 (2025-10-28)

  • Added machine learning model to predict skin and rectal temperature ridge_regression_predict_t_re_t_sk.

3.6.1 (2025-10-07)

  • Fix issue with disc calculation in the two_nodes_gagge model and limiting its value to 6. Close #251

  • Improve documentation for the disc function.

  • PMV ASHRAE model returns the compliance boolean value with the ASHRAE 55:2023 standard. Close #253

  • Improve formatting of models outputs to the console.

3.6.0 (2025-09-22)

3.5.1 (2025-09-15)

  • Improved documentation on how to contribute to the project

3.5.0 (2025-09-10)

  • Added the scale_winds_speed_log function to scale wind speed.

3.4.3 (2025-07-31)

  • fix: wind chill temperature was not imported in pythermalcomfort.models

3.4.2 (2025-07-22)

  • fixed unit of sweat_rate in the PHS model

3.4.1 (2025-07-14)

  • fixed some typo in the documentation

  • better formatted the code

3.4.0 (2025-06-08)

  • Added the work_capacity_dunne.

  • Added the work_capacity_hothaps.

  • Added the work_capacity_iso.

  • Added the work_capacity_niosh.

3.3.0 (2025-06-05)

  • Added the two_nodes_gagge_ji function to calculate the two-node model for older individuals

  • Added the Temperature-Humidity Index (THI).

3.2.0 (2025-05-20)

  • Added the two_nodes_gagge_sleep function to calculate the two-node model for sleeping individuals

  • Added the ESI function to calculate the Environmental Stress Index.

3.1.0 (2025-04-28)

  • Updated the PHS model in compliance with the ISO 7933:2023 standard
    • Added default‑kwarg overrides for 2023 mode (f_r, t_re, t_cr_eq)

    • removed unused variable round from default_kwargs

  • Included test cases according to the ISO 7933:2023 standard

  • Added AutoStrMixin to provide a formatted __str__ representation for result classes

3.0.1 (2025-04-14)

  • allow np.float and np.int as inputs to all functions

  • fixed documentation for phs - met units

3.0.0 (2025-02-03)

2.10.0 (2024-03-18)

  • allow n-dimensional arrays for pet_steady and speedup p_sat calculation

2.9.1 (2024-01-19)

  • Fixed error calculation of mass sweating in PET mode, the unit was incorrect

2.9.0 (2024-01-15)

  • The PHS model accepts arrays as inputs

2.8.11 (2023-10-26)

  • wrote more test and improved code

2.8.11 (2023-10-26)

  • fixed issues with the documentation and sorted the models in alphabetical order

2.8.7 (2023-10-23)

  • Adaptive ASHRAE now returns a dataclass

2.8.6 (2023-10-09)

  • re-structured and linted the code

2.8.4 (2023-09-20)

  • calculation of cooling effect in pmv (standard=’ashrae’) triggered only when v>0.1 m/s

2.8.3 (2023-09-14)

  • general improvements in the JOS3 model

2.8.2 (2023-09-04)

  • general improvements in the JOS3 model

  • fixed error when e_max == 0

2.8.1 (2023-07-05)

  • pythermalcomfort needs Python version > 3.8

  • fixed issue in Cooling Effect calculation

2.8.0 (2023-07-03)

  • allowing the cooling effect to range from 0 to 40

  • fixed PHS documentation

  • improved JOS3 documentation

2.7.0 (2023-02-16)

  • changed coefficient of vasodilation in set_tmp() to 120 to match ASHRAE 55 2020 code

  • slightly modified value in validation tables

2.6.0 (2023-01-17)

  • max sweating rate can be passed to two node model

  • max skin wettedness can be passed to two node model

  • rounding w to two decimals

  • use_fans_heatwave function accepts arrays

  • fixed typos unit documentation

2.5.4 (2022-10-12)

  • PHS model accepts all required inputs to be run on a minute by minute basis

  • fix error check compliance PHS model

2.5.0 (2022-06-13)

  • Added the adaptive thermal heat balance (ATHB) model

2.4.0 (2022-06-10)

  • Added e_pmv model - Adjusted Predicted Mean Votes with Expectancy Factor

  • Added a_pmv model - Adaptive Predicted Mean Vote

2.3.0 (2022-06-01)

  • Added discomfort index

2.2.0 (2022-05-17)

  • Implemented a better equation to calculate the mean radiant temperature

2.1.1 (2022-05-17)

  • Fixed how DISC is calculated

2.1.0 (2022-04-20)

  • Added Physiological Equivalent Temperature (PET) model

  • In PMV and PPD function you can specify if occupants has control over airspeed

2.0.2 (2022-04-12)

  • UTCI accepts lists as inputs

2.0.0 (2022-04-07)

  • Allowing users to pass Numpy arrays or lists as input to the pmv_ppd, pmv, clo_tout, both adaptive models, utci, set_tmp, two_nodes

  • Changed the input variable from return_invalid to limit_input

  • Increased speed by using Numba @vectorize decorator

  • Changed ASHRAE 55 2020 limits to match new addenda

  • Improved documentation

1.11.0 (2022-03-16)

  • Allowing users to pass a Numpy array as input into the UTCI function

  • Numpy is now a requirement of pythermalcomfort

  • Improved PMV, JOS-3, and UTCI documentation

  • Testing PMV, SET, and solar gains models using online reference tables

1.10.0 (2021-11-15)

  • Added JOS-3 model

1.9.0 (2021-10-07)

  • Added Normal Effective Temperature (NET)

  • Added Apparent Temperature (AT)

  • Added Wind Chill Index (WCI)

1.8.0 (2021-09-28)

  • Gagge’s two-node model

  • Added WBGT equation

  • Added Heat index (HI)

  • Added humidex index

1.7.1 (2021-09-08)

  • Added ASHRAE equation to calculate the operative temperature

1.7.0 (2021-07-29)

  • Implemented function to calculate the if fans are beneficial during heatwaves

  • Fixed error in the SET equation to calculated radiative heat transfer coefficient

  • Fixed error in SET definition

  • Moved functions optimized with Numba to new file

1.6.2 (2021-07-08)

  • Updated equation clo_dynamic based on ANSI/ASHRAE Addendum f to ANSI/ASHRAE Standard 55-2020

  • Fixed import errors in examples

1.6.1 (2021-07-05)

  • optimized UTCI function with Numba

1.6.0 (2021-05-21)

  • (BREAKING CHANGE) moved some of the functions from psychrometrics to utilities

  • added equation to calculate body surface area

1.5.2 (2021-05-05)

  • return stress category UTCI

1.5.1 (2021-04-29)

  • optimized phs with Numba

1.5.0 (2021-04-21)

  • added Predicted Heat Strain (PHS) index from ISO 7933:2004

1.4.6 (2021-03-30)

  • changed equation to calculate convective heat transfer coefficient in set_tmp() as per Gagge’s 1986

  • fixed vasodilation coefficient in set_tmp()

  • docs changed term air velocity with air speed and improved documentation

  • added new tests for comfort functions

1.3.6 (2021-02-04)

  • fixed error calculation solar_altitude and sharp for supine person in solar_gain

1.3.5 (2021-02-02)

  • not rounding SET temperature when calculating cooling effect

1.3.3 (2020-12-14)

  • added function to calculate sky-vault view fraction

1.3.2 (2020-12-14)

  • replaced input solar_azimuth with sharp in the solar_gain() function

  • fixed small error in example pmv calculation

1.3.1 (2020-10-30)

  • Fixed error calculation of cooling effect with elevated air temperatures

1.3.0 (2020-10-19)

  • Changed PMV elevated air speed limit from 0.2 to 0.1 m/s

1.2.3 (2020-09-09)

  • Fixed error in the calculation of erf

  • Updated validation table erf

1.2.2 (2020-08-21)

  • Changed default diameter in mean_radiant_tmp

  • Improved documentation

1.2.0 (2020-07-29)

  • Significantly improved calculation speed using numba. Wrapped set and pmv functions

1.0.6 (2020-07-24)

  • Minor speed improvement changed math.pow with **

  • Added validation PMV validation table from ISO 7730

1.0.4 (2020-07-20)

  • Improved speed calculation of the Cooling Effect

  • Bisection has been replaced with Brentq function from scipy

1.0.3 (2020-07-01)

  • Annotated variables in the SET code.

1.0.2 (2020-06-11)

  • Fixed an error in the bisection equation used to calculated Cooling Effect.

1.0.0 (2020-06-09)

  • Major stable release.

0.7.0 (2020-06-09)

  • Added equation to calculate the dynamic clothing insulation

0.6.3 (2020-04-11)

  • Fixed error in calculation adaptive ASHRAE

  • Added some examples

0.6.3 (2020-03-17)

  • Renamed function to_calc to t_o

  • Fixed error calculation of relative air speed

  • renamed input parameter ta to tdb

  • Added function to calculate mean radiant temperature from black globe temperature

  • Added function to calculate solar gain on people

  • Added functions to calculate vapour pressure, wet-bulb temperature, dew point temperature, and psychrometric data from dry bulb temperature and RH

  • Added authors

  • Added dictionaries with reference clo and met values

  • Added function to calculate enthalpy_air

0.5.2 (2020-03-11)

  • Added function to calculate the running mean outdoor temperature

0.5.1 (2020-03-06)

  • There was an error in version 0.4.2 in the calculation of PMV and PPD with elevated air speed, i.e. vr > 0.2 which has been fixed in this version

  • Added function to calculate the cooling effect in accordance with ASHRAE

0.4.1 (2020-02-17)

  • Removed compatibility with python 2.7 and 3.5

0.4.0 (2020-02-17)

  • Created adaptive_EN, v_relative, t_clo, vertical_tmp_gradient, ankle_draft functions and wrote tests.

  • Added possibility to decide with measuring system to use SI or IP.

0.3.0 (2020-02-13)

  • Created set_tmp, adaptive_ashrae, UTCI functions and wrote tests.

  • Added warning to let the user know if inputs entered do not comply with Standards applicability limits.

0.1.0 (2020-02-11)

  • Created pmv, pmv_ppd functions and wrote tests.

  • Documented code.

0.0.0 (2020-02-11)

  • First release on PyPI.

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distribution

pythermalcomfort-3.9.0.tar.gz (473.9 kB view details)

Uploaded Source

Built Distribution

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

pythermalcomfort-3.9.0-py2.py3-none-any.whl (228.6 kB view details)

Uploaded Python 2Python 3

File details

Details for the file pythermalcomfort-3.9.0.tar.gz.

File metadata

  • Download URL: pythermalcomfort-3.9.0.tar.gz
  • Upload date:
  • Size: 473.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for pythermalcomfort-3.9.0.tar.gz
Algorithm Hash digest
SHA256 982cb60fc08e3f1f7ac98f439a8e466413142eb2a934ae9ad42b109569967ff6
MD5 3f9090fb0dd01fa267a7ccdc0a5d132b
BLAKE2b-256 db7bdf280aadc06b1e2a77f3c80e8cc1bb81c1de3e4aa1afe61427ca1f3c1477

See more details on using hashes here.

File details

Details for the file pythermalcomfort-3.9.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for pythermalcomfort-3.9.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 3de525f221e73ab2c6d3718eb37fef99d095522ca66d5aa05d57f3e53407032e
MD5 e71a80a4ece0ba390ae5bfd08aad058e
BLAKE2b-256 b9ec90c0f8d548bda650c63aa1c032e0541fe3828c69bd370fff7838ee0b4591

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