What’s New#

These are new features and improvements of note in each release.

v0.10.5 (May 6, 2024)#

Bug fixes#


  • Fix variable name typo at docs\examples\system-models\plot_oedi_9068.py. (GH1996)

  • Remove “Comparison with PVLib for Matlab” page from the User Guide. (GH2010, GH2012)


  • Minimum version of Python increased from 3.7 to 3.8. (GH1975, GH2029)

  • Minimum version of scipy advanced from 1.5.0 to 1.6.0. (GH2027)


v0.10.4 (March 19, 2024)#


Bug fixes#



  • Minimum version of pandas advanced from 0.25.0 to 1.3.0. (GH1969)

  • Minimum version of numpy advanced from 1.16.0 to 1.17.3. (GH1969)


v0.10.3 (December 20, 2023)#


Bug fixes#


  • Replace use of deprecated pkg_resources. (GH1881, GH1882)

  • Added Python 3.12 to test suite. (GH1886)



  • Minimum version of scipy advanced from 1.4.0 to 1.5.0. (GH1918, GH1919)


v0.10.2 (September 21, 2023)#


Bug fixes#




v0.10.1 (July 3, 2023)#

To resolve an installation issue with pvfactors and shapely, this release drops the optional pvfactors dependency and replaces it with solarfactors, a fork of pvfactors maintained by the pvlib community. This change should not affect any user code. (GH1796, GH1797, GH1657)

v0.10.0 (June 30, 2023)#

Breaking changes#



Bug fixes#




  • With the removal of pvlib.forecast, the following packages are no longer listed as (optional) dependencies: netCDF4, cftime, and siphon. (GH1766)


v0.9.5 (March 18, 2023)#

Starting with this version, new releases are no longer distributed through the pvlib conda channel. We recommend conda users install from the conda-forge channel instead (see Installation).


Bug fixes#




  • Added benchmarks for pvlib.bifacial.infinite_sheds. (GH1627)


  • Removed unnecessary nose test requirement. (GH1637)


v0.9.4 (December 20, 2022)#


Bug fixes#




  • Removed time_tracker_singleaxis function from tracking.py. (GH1508, GH1535)


  • Minimum version of scipy advanced from 1.2.0 to 1.4.0. (GH483, GH1617)


v0.9.3 (September 15, 2022)#



  • Clarified description of cross-axis slope in pvlib.tracking (GH1530)

  • Removed the kwarg closed from pd.date_range in the examples since it is deprecated for pandas >= 1.4.0. (GH1540)


v0.9.2 (August 19, 2022)#


Bug fixes#


  • Switched CI testing provider from Azure to GitHub Actions. (GH1306)

  • Speed up CI setup using micromamba instead of conda. (GH1493)

  • Drop python 3.6 (reached end of life Dec 2021) and add 3.10 to test matrix. (GH1507)



  • Updated version of numba in asv.conf from 0.36.1 to 0.40.0 to solve numba/numpy conflict. (GH1439, GH1440)

  • Added benchmarks for the pvlib.scaling module. (GH1445)

  • Added a basic CI asv check. (GH1446, GH1454)


  • Python 3.7 or greater. (GH1507)

  • Minimum pandas version increased to v0.25.0, released July 18, 2019. (GH1448)


v0.9.1 (March 29, 2022)#



Bug fixes#


  • Updated test values to match the new values returned by the PVGIS TMY API. The difference is very minor (0.01 W/m2, affecting only a few beam irradiance values) (GH1396)



  • numpy >= 1.16.0 is now required for all python versions. (GH1400)

  • Fix an installation issue with dataclasses on python 3.6 (GH1302, GH1422)


v0.9.0 (September 1, 2021)#

Breaking changes#


  • The following ModelChain attributes are deprecated. They have been moved to the ModelChainResult class that is accessible via ModelChain.results:

    • ModelChain.ac

    • ModelChain.airmass

    • ModelChain.aoi

    • ModelChain.aoi_modifier

    • ModelChain.cell_temperature

    • ModelChain.dc

    • ModelChain.diode_params

    • ModelChain.effective_irradiance

    • ModelChain.losses

    • ModelChain.solar_position

    • ModelChain.spectral_modifier

    • ModelChain.total_irrad

    • ModelChain.tracking

    • ModelChain.weather

    • ModelChain.times

  • The following PVSystem cell temperature methods have been deprecated and consolidated into the new wrapper method get_cell_temperature() (GH1211):

    • sapm_celltemp()

    • pvsyst_celltemp()

    • faiman_celltemp()

    • fuentes_celltemp()

    • noct_sam_celltemp()

  • The eta_m parameter for pvsyst_cell() is replaced by parameter module_efficiency. (GH1188, GH1218)

  • The following attributes of pvlib.pvsystem.PVSystem and pvlib.tracking.SingleAxisTracker have been deprecated in favor of the corresponding pvlib.pvsystem.Array attributes:

    • PVSystem.albedo

    • PVSystem.module

    • PVSystem.module_parameters

    • PVSystem.module_type

    • PVSystem.modules_per_string

    • PVSystem.racking_model

    • PVSystem.strings_per_inverter

    • PVSystem.surface_tilt

    • PVSystem.surface_azimuth

    • PVSystem.temperature_model_parameters

  • The pvlib.tracking.SingleAxisTracker class is deprecated and replaced by using pvlib.pvsystem.PVSystem with the new pvlib.pvsystem.SingleAxisTrackerMount (GH1176)


Bug fixes#

  • Corrected an error in perez() where the horizon irradiance component was prevented from taking negative values. Negative values are intentional according to the original publication. Changes in output are expected to be small and primarily occur at low irradiance conditions. (GH1238, GH1239)

  • Pass weather data to solar position calculations in prepare_inputs_from_poa(). (GH1065, GH1140)

  • Reindl model fixed to generate sky_diffuse=0 when GHI=0. (GH1153, GH1154)

  • Fix floating point round-off issue in aoi_projection() (GH1185, GH1191)

  • Update GFS product names for GFS v16. (GH1202, GH1203)

  • Take into account EgRef, dEgdT, irrad_ref and temp_ref when calling calcparams_cec(). (GH1215, GH1216)

  • Corrected methodology error in wvm(). Tracks with fix in PVLib for MATLAB. (GH1206, GH1213)

  • Corrected an error affecting detect_clearsky() when data time step is not one minute. Error was introduced in v0.8.1. (GH1241, GH1242)

  • Corrected error affecting _compute_wavelet() when passing a pandas time series with a sampling rate faster than 1 second. (GH1257, GH1258)

  • Changed deprecated use of .astype() to .view() in solarposition. (GH1256, GH1261, GH1262)

  • Fix singleaxis() AOI wrong when sun behind module. (GH1273, GH1221)

  • Fix get_data() failure to correct for non-UTC timezones. (GH1237, GH1285)

  • Fixed HRRR by changing model name to reflect change on the server. (GH1291, GH1292)


  • Added __init__.py to pvlib/tests and subdirectories. This follows pytest recommendations for package layout and imports from conftest.py. Solves issue with test discovery in vscode. (GH1204)


  • Update intro tutorial to highlight the use of historical meteorological data and to make the procedural and OO results match exactly. (GH1116, GH1144)

  • Add a gallery example showing how to appropriately use interval-averaged weather data for modeling. (GH1152)

  • Update documentation links in pvlib.iotools.get_psm3() (GH1169)

  • Use Mount classes in introtutorial and pvsystem docs pages (GH1267)

  • Clarified how statistics are calculated for pvlib.clearsky.detect_clearsky() (GH1070, GH1243)

  • Add gallery examples using the new Mount classes (GH1266)

  • Add “powered by pvlib” logos (GH1277)


  • dataclasses is required for python 3.6 (GH1076)

  • h5py is now a required dependency. This replaces tables, which was formerly an optional dependency. (GH1299, GH1252, GH1286)


v0.8.1 (January 4, 2021)#



Bug fixes#


  • Add airspeed velocity performance testing configuration and a few benchmarks. (GH419, GH1049, GH1059)

  • Add Python 3.9 CI configurations. (GH1102, GH1112)

  • Update test_pvgis.py to be more flexible about the PVGIS copyright notice (GH1121)


  • Update sphinx to 3.1.2 and use the recursive option in autosummary class template. (GH1055, GH1075)

  • Add gallery example about backtracking on sloped terrain. (GH1077)

  • Add toggle button for code prompts to make copying code easier (GH1096)

  • Add project urls to setup.py for pypi page (GH1119)


v0.8.0 (September 8, 2020)#

Breaking changes#


  • Moved functions related to inverters from pvsystem.py to inverter.py. Functions are renamed to follow a more consistent pattern, as follows (GH886):

  • Argument ac_model for pvlib.modelchain.ModelChain now accepts 'sandia', 'pvwatts' and 'adr' for the inverter models. (GH886)

  • pvlib.pvsystem.PVSystem module_type and racking_model now default to None. This continues a deprecation of assuming SAPM values for cell temperature modeling. In this v0.8 release series, calling pvlib.pvsystem.PVSystem.sapm_celltemp() without setting PVSystem.temperature_model_parameters, or a valid combination of PVsystem.module_type and PVsystem.racking_model, will cause PVSystem.temperature_model_parameters to be set to SAPM values for a glass/glass module in open racking and emit a warning. In v0.9, users must provide temperature_model_parameters or a valid combination of module_type and racking_model. (GH1030, GH1033)

  • Deprecated arbitrary keyword arguments for pvlib.location.Location, pvlib.pvsystem.PVSystem, pvlib.tracking.SingleAxisTracker, and pvlib.modelchain.ModelChain. Supplying arbitrary keyword to these objects will result in TypeErrors in v0.9. (GH1029, GH1053)

  • pvlib.pvsystem.LocalizedPVSystem and pvlib.pvsystem.LocalizedSingleAxisTracker are deprecated and will be removed in 0.9. Use pvlib.location.Location, pvlib.pvsystem.PVSystem, pvlib.tracking.SingleAxisTracker, and pvlib.modelchain.ModelChain instead. (GH1029, GH1034, GH1053)


Bug fixes#

  • Fixed unit and default value errors in pvlib.soiling.hsu(). (GH977, GH980)

  • Handle NUL characters and fix version column dtype in read_crn(). (GH1025)

  • Fix low sun angle tracker rotation calculation. (GH824)

  • Fix issue with big-endian and little-endian data in forecast.py. (GH921)


  • Decorator pvlib.conftest.fail_on_pvlib_version() can now be applied to functions that require args or kwargs. (GH973)

  • Test added for pvlib.modelchain.ModelChain to confirm ValueError when ac_model is an invalid string. (GH886)

  • Add minimum requirements configuration to Azure Pipelines build. (GH1006)

  • Update the data/test_psm3_tmy-2017.csv datafile to match the updated NSRDB data. (GH1005, GH1007)

  • Add wrappers around the pandas assert_X_equal functions to accommodate the changed API and default precision thresholds in pandas 1.1.0 (GH1018, GH1021)

  • Add github action for publishing tags to pypi.org. (GH950, GH1038, GH1039)

  • Remove Travis CI configuration. (GH950)



  • Python 3.6 or greater. (GH1035)

  • Minimum pandas version increased to v0.22.0, released Dec 31, 2017. (GH1003)

  • Scipy >= v1.2.0, released Dec 17, 2018, is now a required dependency rather an optional dependency. (GH972, GH1035)


v0.7.2 (April 22, 2020)#

API Changes#

  • pvlib.forecast.ForecastModel now requires start and end arguments to be tz-localized. (GH877, GH879)

  • pvlib.iotools.read_tmy3() when coerced to a single year now returns indices that are monotonically increasing. Therefore, the last index will be January 1, 00:00 of the next year. (GH910)

  • Renamed pvlib.losses to pvlib.soiling. Additional loss models will go into code modules named for the loss or effect type. (GH935, GH891)

  • Renamed pvlib.losses.soiling_hsu to pvlib.soiling.hsu() (GH935)


Bug fixes#

  • Fix read_tmy3() parsing when February contains a leap year. (GH866)

  • Implement NREL Developer Network API key for consistent success with API calls in pvlib.tests.iotools.test_psm3. (GH873)

  • Fix issue with pvlib.location.Location creation when passing tz=datetime.timezone.utc. (GH879)

  • Fix documentation homepage title to “pvlib python” based on first heading on the page. (GH890) (GH888)

  • Fix missing 0.7.0 what’s new entries about changes to PVSystem.pvwatts_ac. Delete unreleased 0.6.4 what’s new file. (GH898)

  • Compatibility with cftime 1.1. (GH895)

  • Minor implemention changes to avoid runtime and deprecation warnings in detect_clearsky(), martin_ruiz_diffuse(), soiling_hsu(), and various test functions.

  • Fix read_tmy3() so that when coerced to a single year the TMY3 index will be monotonically increasing. (GH910)

  • Fix pvlib.spa.julian_day_dt() so that microseconds are scaled correctly (GH940) (GH942)


  • Rename system fixture to sapm_dc_snl_ac_system in model chain tests. (GH908, GH915).

  • Implement pytest-remotedata to increase test suite speed. Requires --remote-data pytest flag to execute data retrieval tests over a network. (GH882)(GH896)

  • Add Python3.8 to Azure Pipelines CI. (GH903)(GH904)

  • Add documentation build test to Azure Pipelines CI. (GH909)

  • Implement the pytest.mark.flaky decorator from pytest-rurunfailures https://github.com/pytest-dev/pytest-rerunfailures on all network dependent iotools tests to repeat them on failure. (GH919)

  • Separate azure-pipelines.yml platform-specific tests to their own templates located in ./ci/azure/. (GH926)


  • Add NumFOCUS affiliation to Sphinx documentation. (GH862)

  • Add example of IV curve generation. (GH872)

  • Add section about gallery examples to Contributing guide. (GH905)

  • Add section with link to Code of Conduct in Contributing guide. (GH922)

  • Add example of GHI to POA transposition (GH933)


  • nrel-pysam (optional) minimum set to v1.0.0 (GH874)

  • cftime (optional) minimum set to >=1.1.1. Use of only_use_python_datetimes kwarg in netCDF4.num2date in forecast.py requires >=1.1.1 which is >=Python3.6. (GH947)


v0.7.1 (January 17, 2020)#


  • Added read_psm3() to read local NSRDB PSM3 files and parse_psm3() to parse local NSRDB PSM3 file-like objects. (GH841)

  • Added leap_day parameter to iotools.get_psm3 instead of hardcoding it as False.

  • Added get_pvgis_tmy() to get PVGIS TMY datasets. (GH845)

  • Added parse_epw() to parse a file-like buffer containing weather data in the EPW format.

  • Added a new module pvlib.losses for various loss models.

  • Added the Humboldt State University soiling model soiling_hsu(). (GH739)

Bug fixes#

  • Fix error in logic for emitting deprecation warning in sapm() (GH844)

  • Changed the PSM3 API endpoint for TMY requests in iotools.get_psm3.


  • Added single-year PSM3 API test for iotools.get_psm3.

  • Added tests for iotools.parse_psm3 and iotools.read_psm3.

  • Change pvlib/test folder to pvlib/tests and reorganize tests into subfolders, e.g.: created pvlib/tests/iotools (GH859)

  • replace os.path with pathlib and stringify path objects for Python<=3.5


  • Created an Example Gallery. (GH846)

  • Updated list of allowed years for iotools.get_psm3.


v0.7.0 (December 18, 2019)#

This is a major release that drops support for Python 2 and Python 3.4. We recommend all users of v0.6.3 upgrade to this release after checking API compatibility notes.

Python 2.7 support ended on June 1, 2019. (GH501) Minimum numpy version is now 1.12.0. Minimum pandas version is now 0.18.1. (GH830, GH748)

API Breaking Changes#

  • The effective_irradiance argument for pvsystem.sapm() now requires units of W/m^2. Previously, units for this input were suns. A RuntimeWarning warning is raised if all effective_irradiance < 2.0.

  • The output of pvsystem.sapm_effective_irradiance() is now in units of W/m2 rather than suns.

  • Calling pvlib.pvsystem.retrieve_sam() with no parameters will raise an exception instead of displaying a dialog.

  • The modelchain.ModelChain.diode_params attribute is now formatted in a pandas.DataFrame with DatetimeIndex, rather than in a tuple.

  • PVSystem.pvwatts_ac now uses inverter DC input limit PVSystem.inverter_parameters['pdc0'] instead of module nameplate capacity PVSystem.module_parameters['pdc0']. (GH734)

  • ModelChain.infer_ac_model now uses the presence of the key 'pdc0' PVSystem.inverter_parameters to determine if the pvwatts_ac inverter model should be used. The inference method previously looked for the key in PVSystem.module_parameters. (GH734)

API Changes with Deprecations#

  • Changes related to cell temperature models (GH678):
    • Changes to functions
      • Moved functions for cell temperature from pvsystem.py to temperature.py.

      • Renamed pvsystem.sapm_celltemp and pvsystem.pvsyst_celltemp to temperature.sapm_cell and temperature.pvsyst_cell.

      • temperature.sapm_cell returns only the cell temperature, whereas the old pvsystem.sapm_celltemp returned a DataFrame with both cell and module temperatures.

      • Created temperature.sapm_module to return module temperature using the SAPM temperature model.

      • Changed the order of arguments for pvsystem.sapm_celltemp, pvsystem.pvsyst_celltemp and PVSystem.sapm_celltemp to be consistent among cell temperature model functions.

      • Removed model as a kwarg from temperature.sapm_cell and temperature.pvsyst_cell. These functions now require model-specific parameters.

      • Added the argument irrad_ref, default value 1000, to temperature.sapm_cell.

    • Changes to named temperature model parameter sets
      • Renamed pvsystem.TEMP_MODEL_PARAMS to temperature.TEMPERATURE_MODEL_PARAMETERS.

      • temperature.TEMPERATURE_MODEL_PARAMETERS uses dict rather than tuple for a parameter set.

      • Names for parameter sets in temperature.TEMPERATURE_MODEL_PARAMETERS have changed.

      • Parameter sets for the SAPM cell temperature model named ‘open_rack_polymer_thinfilm_steel’ and ‘22x_concentrator_tracker’ are considered obsolete and have been removed.

    • Changes to PVSystem class
      • Changed the model kwarg in PVSystem.sapm_celltemp and PVSystem.pvsyst_celltemp to parameter_set. parameter_set expects a str which is a valid key for temperature.TEMPERATURE_MODEL_PARAMETERS for the corresponding temperature model.

      • Added an attribute PVSystem.module_type (str) to record module front and back materials, default is glass_polymer.

      • Changed meaning of PVSystem.racking_model to describe racking only, e.g., default is open_rack.

      • Added an attribute PVSystem.temperature_model_parameters (dict). to contain temperature model parameters.

      • If PVSystem.temperature_model_parameters is not specified and PVSystem.racking_model and PVSystem.module_type combine to a valid parameter set name for the SAPM cell temperature model, that parameter set is assigned to PVSystem.temperature_model_parameters. Otherwise PVSystem.temperature_model_parameters is assigned an empty dict. The result is that the default parameter set for SAPM cell temperature model is open_rack_glass_polymer; the old default was open_rack_glass_glass.

    • Changes to ModelChain class
      • ModelChain.temp_model renamed to ModelChain.temperature_model.

      • ModelChain.temperature_model now defaults to None. The temperature model can be inferred from PVSystem.temperature_model_parameters.

      • ModelChain.temperature_model_parameters now defaults to None. The temperature model can be inferred from PVSystem.temperature_model_parameters.

      • ModelChain.temps attribute renamed to ModelChain.cell_temperature, and its datatype is now numeric rather than DataFrame.

      • If PVSystem.temperature_model_parameters is not specified, ModelChain defaults to old behavior, using the SAPM temperature model with parameter set open_rack_glass_glass. This behavior is deprecated, and will be removed in v0.8. In v0.8 PVSystem.temperature_model_parameters will be required for ModelChain.

      • Implemented pvsyst as an option for ModelChain.temperature_model.

      • modelchain.basic_chain has a new required argument temperature_model_parameters.

  • Changes related to IAM (AOI loss) functions (GH680):
    • Changes to functions
      • Moved functions from pvsystem.py to iam.py. pvsystem IAM functions are deprecated and will be removed in v0.8.

      • Functions are renamed to a consistent pattern:
        • pvsystem.physicaliam is iam.physical

        • pvsystem.ashraeiam is iam.ashrae

        • pvsystem.sapm_aoi_loss is iam.sapm

    • Changes to PVSystem class
      • IAM models are provided by PVSystem.get_iam with kwarg iam_model.

      • Methods PVSystem.ashraeiam, PVSystem.physicaliam and PVSystem.sapm_aoi_loss are deprecated and will be removed in v0.8.

  • Changes related to spectral modifier (GH782):
    • Changes to functions
      • Added the argument pw_min and pw_max, default values 0.1 and 8 resp., to atmosphere.first_solar_spectral_correction. This function now returns NaN if pw value higher than pw_max.

  • The times keyword argument has been deprecated in the pvlib.modelchain.ModelChain.run_model(), pvlib.modelchain.ModelChain.prepare_inputs(), and pvlib.modelchain.ModelChain.complete_irradiance() methods. Model times are now determined by the input weather. DataFrame. Therefore, the weather DataFrame must have a DatetimeIndex. The weather argument of the above methods is now the first, required positional argument and the times argument is kept as the second keyword argument for capability during the deprecation period.

  • Parameter pvsystem.DC_MODEL_PARAMS is renamed to pvsystem._DC_MODEL_PARAMS. Users should not rely on this dictionary’s existence or structure.

Other API Changes#

  • pvlib.iotools.midc.read_midc() now passes additional keyword arguments to pandas.read_csv

  • Add timeout argument to pvlib.iotools.midc.read_midc_raw_data_from_nrel()

  • pvlib.bifacial is now imported when pvlib is imported. (GH766)


  • Created one new temperature model function: pvlib.temperature.faiman(). (GH750)

  • Created two new incidence angle modifier (IAM) functions: pvlib.iam.martin_ruiz() and pvlib.iam.interp(). (GH751)

  • Created one new incidence angle modifier (IAM) function for diffuse irradiance: pvlib.iam.martin_ruiz_diffuse(). (GH751)

  • Add the martin_ruiz IAM function as an option for ModelChain.aoi_model.

  • Updated the file for module parameters for the CEC model, from the SAM file dated 2017-6-5 to the SAM file dated 2019-03-05. (GH761)

  • Updated the file for inverter parameters for the CEC model, from the SAM file dated 2018-3-18 to the SAM file dated 2019-03-05. (GH761)

  • Added recombination current parameters to bishop88 single-diode functions and also to pvlib.pvsystem.max_power_point(). (GH762)

  • Add ivtools module to contain functions for IV model fitting.

  • Add fit_sde_sandia(), a simple method to fit the single diode equation to an IV curve.

  • Add fit_sdm_cec_sam(), a wrapper for the CEC single diode model fitting function ‘6parsolve’ from NREL’s System Advisor Model.

  • Add fit_sdm_desoto(), a method to fit the De Soto single diode model to the typical specifications given in manufacturers datasheets.

  • Add timeout to pvlib.iotools.get_psm3().

  • Add wvm(), a port of the wavelet variability model for computing reductions in variability due to a spatially distributed plant.

  • Add from_epw(), a method to create a Location object from epw metadata, typically coming from pvlib.iotools.epw.read_epw.

Bug fixes#

  • Fix handling of keyword arguments in forecasts.get_processed_data. (GH745)

  • Fix output as Series feature in pvlib.pvsystem.ashraeiam().

  • Fix rounding issue in clearsky._linearly_scale, a function that converts longitude or latitude degree to an index number in a Linke turbidity lookup table. Also rename the function to clearsky._degrees_to_index. (GH754)

  • Fix reading raw MIDC CSV files from NREL where the number of header columns does not match the number of data columns.

  • Fix installation issue due to missing requests dependency. (GH725)

  • PVSystem.pvwatts_ac now uses inverter DC input limit PVSystem.inverter_parameters['pdc0'] instead of module nameplate capacity PVSystem.module_parameters['pdc0']. (GH734)


  • Added 30 minutes to timestamps in test_psm3.csv to match change in NSRDB (GH733)

  • Added tests for methods in bifacial.py.

  • Added tests for changes to cell temperature models.

  • Add tests configuration for bare python environment (no conda). (GH727)

  • Added tests for changes to IAM models.

  • Added test for ModelChain.infer_aoi_model.


  • Corrected docstring for pvsystem.PVSystem.sapm

  • Fixed broken ipython examples from CEC data updates

  • Edited docstring for pvsystem.sapm to remove DataFrame option for input module. The DataFrame option was never tested and would cause an error if used. (GH785)

  • Note warning about _TMY3.epw files retrieved from energyplus.net in docstring of epw.read_epw

  • Improved sphinx rendering of API reference entries for clearsky.ineichen, clearsky.haurwitz, tracking.singleaxis, iotools.read_midc, Location.from_tmy, ModelChain.run_model, ModelChain.complete_irradiance, and ModelChain.prepare_inputs

  • Removed duplicate pvwatts_losses entry in api.rst

Removal of prior version deprecations#

  • Removed irradiance.extraradiation.

  • Removed irradiance.grounddiffuse.

  • Removed irradiance.total_irrad.

  • Removed irradiance.globalinplane.

  • Removed atmosphere.relativeairmass.

  • Removed atmosphere.relativeairmass.

  • Removed solarposition.get_sun_rise_set_transit.

  • Removed tmy module.

  • Removed ModelChain.singlediode method.

  • Removed ModelChain.prepare_inputs clearsky assumption when no irradiance data was provided.


  • numpy minimum increased to v1.12.0, released in 2017. (GH830)

  • pandas minimum increased to v1.18.1, released in 2016. (GH748)


v0.6.3 (May 15, 2019)#

This is a minor release on top of v0.6.2 to fix an installation issue. We recommend that all users of v0.6.1 and v0.6.2 upgrade to this release.

Python 2.7 support will end on June 1, 2019. Releases made after this date will require Python 3. This release is likely to be the last that supports Python 2.7. (GH501)

Bug fixes#

  • Fix installation issue due to missing requests dependency. (GH725)


v0.6.2 (May 15, 2019)#

This is a minor release. We recommend all users of v0.6.1 upgrade to this release.

Python 2.7 support will end on June 1, 2019. Releases made after this date will require Python 3. This release is likely to be the last that supports Python 2.7. (GH501)

Minimum pandas requirement bumped 0.15.0=>0.16.0

API Changes#

  • erbs() doy argument changed to datetime_or_doy to be consistent with allowed types and similar functions (disc(), get_extra_radiation()). (GH681)

  • erbs() DataFrame vs. OrderedDict return behavior now determined by type of datetime_or_doy instead of ghi or zenith. (GH681)

  • Added min_cos_zenith and max_zenith keyword arguments to erbs(). (GH681)

  • Deprecated prepare_inputs() assumption of clear sky if no irradiance fields were provided. (GH705, GH707)

  • Remove automatic column name mapping from read_midc() and read_midc_raw_data_from_nrel() and added optional keyword argument variable_map to map columns. (GH721)

  • Update pvfactors_timeseries() and tests to use pvfactors v1.0.1 (GH699)


Bug fixes#

  • Compatibility with pandas 0.24 deprecations. (GH659)

  • pvwatts_ac() raised ZeroDivisionError when called with scalar pdc=0 and a RuntimeWarning for array(0) input. Now correctly returns 0s of the appropriate type. (GH675)

  • Fixed erbs() behavior when zenith is near 90 degrees. (GH681)

  • dni() now referenced in API under Decomposing and Combining irradiance header. (GH686)

  • Fixed NaN output from singleaxis() when sun near horizon. (GH656)

  • Fixed numpy warnings in singleaxis() when comparing NaN values to limits. (GH622)

  • Change ModelChain to apply pvwatts_losses to mc.dc instead of mc.ac. (GH696)

  • Fixed a bug in the day angle equation for the ASCE extraterrestrial irradiance model. (GH211)

  • Silenced divide by 0 irradiance warnings in klucher() and calcparams_desoto(). (GH698)

  • Fix NDFD model by updating variables.

  • Fix format_index() to parse non one-minute data correctly. (GH709)


  • Remove most expected warnings emitted by test suite. (GH698)


v0.6.1 (January 31, 2019)#

This is a minor release. We recommend all users of v0.6.0 upgrade to this release.

Python 2.7 support will end on June 1, 2019. Releases made after this date will require Python 3. (GH501)

Minimum pandas requirement bumped 0.14.0=>0.15.0

API Changes#


Bug fixes#

  • Fix when building documentation using Matplotlib 3.0 or greater.

  • ~pvlib.spa.calculate_deltat: Fix constant coefficient of the polynomial expression for years >= 1860 and < 1900, fix year 2050 which was returning 0. (GH600)

  • Fix and improve hour_angle() (GH598)

  • Fix error in pvlib.clearsky.detect_clearsky() (GH506)

  • Fix documentation errors when using IPython >= 7.0.

  • Fix error in pvlib.modelchain.ModelChain.infer_spectral_model() (GH619)

  • Fix error in pvlib.spa when using Python 3.7 on some platforms.

  • Fix error in pvlib.irradiance._delta_kt_prime_dirint() (GH637). The error affects the first and last values of DNI calculated by the function pvlib.irradiance.dirint()

  • Fix errors on Python 2.7 and Numpy 1.6. (GH642)

  • Replace deprecated np.asscalar with array.item(). (GH642)


  • Add test for hour_angle() (GH597)

  • Update tests to be compatible with pytest 4.0. (GH623)

  • Add tests for pvlib.bifacial.pvfactors_timeseries() implementation (GH421)


v0.6.0 (September 17, 2018)#

This is a major release and contains a large number of API changes, new features, and bug fixes. Users should carefully read the changelog below before upgrading.

Python 2.7 support will end on June 1, 2019. Releases made after this date will require Python 3. (GH501)

API Changes#

  • pvlib python is changing a handful of function names. In general, functions that can calculate a quantity using multiple algorithms now start with the prefix get_. For example, relativeairmass can calculate airmass using one of many model arguments. Its name has been changed to get_relative_airmass(). The old function names remain in this release, but will emit a PVLibDeprecationWarning when called. The old functions will be removed in the v0.7 release. Functions composed of multiple words jammed together have been renamed with underscores separating the words (see above). Each change is detailed below. (GH427)

  • Deprecated relativeairmass; it will be removed in v0.7. Use the new get_relative_airmass() instead. (GH427)

  • Deprecated absoluteairmass; it will be removed in v0.7. Use the new get_absolute_airmass() instead. (GH427)

  • Deprecated irradiance.globalinplane; it will be removed in v0.7. Use the new poa_components() instead. (GH427)

  • Added poa_components(). Function is the same as the now-deprecated irradiance.globalinplane, but adds 'poa_sky_diffuse' and 'poa_ground_diffuse' to the output. (GH427)

  • Deprecated irradiance.extraradiation; it will be removed in v0.7. Use pvlib.irradiance.get_extra_radiation() instead. (GH427)

  • Deprecated irradiance.grounddiffuse; it will be removed in v0.7. Use get_ground_diffuse() instead. (GH427)

  • Added get_poa_sky_diffuse(). (GH427)

  • Deprecated irradiance.total_irrad; it will be removed in v0.7. Use get_total_poa_irradiance() instead. (GH427)

  • Removed 'klutcher' from get_sky_diffuse/total_irrad. This misspelling was deprecated long ago but never removed. (GH97)

  • calcparams_desoto() now requires arguments for each module model parameter. (GH462)

  • Add losses_parameters attribute to PVSystem objects and remove the kwargs support from PVSystem.pvwatts_losses. Enables custom losses specification in ModelChain calculations. (GH484)

  • removed irradiance parameter from ModelChain.run_model and ModelChain.prepare_inputs

  • Add perez_enhancement keyword argument to clearsky.ineichen to control whether or not the “perez enhancement factor” is applied. The enhancement factor was always applied until now. Now it is turned off by default. The enhancement factor can yield unphysical results, especially for latitudes closer to the poles and especially in the winter months. It may yield improved results under other conditions. (GH435)

  • Add min_cos_zenith, max_zenith keyword arguments to disc, dirint, and dirindex functions. (GH311, GH396)

  • Method ModelChain.infer_dc_model now returns a tuple (function handle, model name string) instead of only the function handle (GH417)

  • Add DC model methods desoto and pvsyst to ModelChain, and deprecates DC model method singlediode (singlediode defaults to desoto until v0.7.0) (GH487)

  • Add the CEC module model in pvsystem.calcparams_cec and ModelChain.cec. The CEC model differs from the desoto model by using the parameter Adjust. Modules selected from the SAM CEC library sam-library-cec-modules-2017-6-5.csv include the Adjust parameter and ModelChain.infer_dc_model will now select the cec model rather than the desoto model. (GH463)

  • The behavior of irradiance.perez(return_components=True) has changed. The function previously returned a tuple of total sky diffuse and an OrderedDict/DataFrame of components. The function now returns an OrderedDict/DataFrame with total sky diffuse and each component. The behavior for return_components=False remains unchanged. (GH434)


  • Add sea surface albedo in irradiance.py (GH458)

  • Implement first_solar_spectral_loss() in modelchain.py (GH359)

  • Clarify arguments Egref and dEgdT for calcparams_desoto() (GH462)

  • Add pvsystem.calcparams_pvsyst to compute values for the single diode equation using the PVsyst v6 model (GH470)

  • Extend singlediode() with an additional keyword argument method in ('lambertw', 'newton', 'brentq'), default is 'lambertw', to select a method to solve the single diode equation for points on the IV curve. Selecting either 'brentq' or 'newton' as the method uses bishop88() with the corresponding method. (GH410)

  • Implement new methods 'brentq' and 'newton' for solving the single diode equation for points on the IV curve. 'brentq' uses a bisection method (Brent, 1973) that may be slow but guarantees a solution. 'newton' uses the Newton-Raphson method and may be faster but is not guaranteed to converge. However, 'newton' should be safe for well-behaved IV curves. (GH408)

  • Implement bishop88() for explicit calculation of arbitrary IV curve points using diode voltage instead of cell voltage. If method is either 'newton' or 'brentq' and ivcurve_pnts in singlediode() is provided, the IV curve points will be log spaced instead of linear.

  • Implement estimate_voc() to estimate open circuit voltage by assuming \(R_{sh} \to \infty\) and \(R_s=0\) as an upper bound in bisection method for singlediode() when method is either 'newton' or 'brentq'.

  • Add max_power_point() method to compute the max power point using the new 'brentq' method.

  • Add new module pvlib.singlediode with low-level functions for solving the single diode equation such as: bishop88(), estimate_voc(), bishop88_i_from_v(), bishop88_v_from_i(), and bishop88_mpp().

  • Add PVSyst thin-film recombination losses for CdTe and a:Si (GH163)

  • Python 3.7 officially supported. (GH496)

  • Improve performance of solarposition.ephemeris. (GH512)

  • Improve performance of Location.get_airmass. Most noticeable when solar position is supplied, time index length is less than 10000, and method is looped over. (GH502)

  • Add irradiance.gti_dirint function. (GH396)

  • Add irradiance.clearness_index function. (GH396)

  • Add irradiance.clearness_index_zenith_independent function. (GH396)

  • Add checking for consistency between module_parameters and dc_model. (GH417)

  • Add DC model methods 'desoto' and 'pvsyst' to ModelChain (GH487)

  • Add the CEC module model in pvsystem.calcparams_cec and ModelChain.cec. (GH463)

  • Add DC model methods desoto and pvsyst to ModelChain (GH487)

  • pvlib now ships with a pvlib[optional] installation option to automatically install packages needed to support additional pvlib features: pip install pvlib[optional]. Additional installation options include doc (requirements for minimal documentation build), test (requirements for testing), and all (optional + doc + test). (GH553, GH483)

  • Set default alpha to 1.14 in angstrom_aod_at_lambda() (GH563)

  • tracking.singleaxis now accepts scalar and 1D-array input.

Bug fixes#

  • Unset executable bits of irradiance.py and test_irradiance.py (GH460)

  • Fix failing tests due to column order on Python 3.6+ and Pandas 0.23+ (GH464)

  • ModelChain.prepare_inputs failed to pass solar_position and airmass to Location.get_clearsky. Fixed. (GH481)

  • Add User-Agent specification to TMY3 remote requests to avoid rejection. (GH493)

  • Fix pvlib.irradiance.klucher output is different for Pandas Series vs. floats and NumPy arrays. (GH508)

  • Make GitHub recognize the license, add AUTHORS.md, clarify shared copyright. (GH503)

  • Fix issue with non-zero direct irradiance contribution to Reindl, Klucher, and Hay-Davies diffuse sky algorithms when the sun is behind the array. (GH526)

  • Fix issue with dividing by near-0 cos(solar_zenith) values in Reindl and Hay-Davies diffuse sky algorithms. (GH432)

  • Fix argument order of longitude and latitude when querying weather forecasts by lonlat bounding box (GH521)

  • Fix issue with unbounded clearness index calculation in disc. (GH540)

  • Limit pvwatts_ac results to be greater than or equal to 0. (GH541)

  • Fix bug in get_relative_airmass(model=’youngirvine1967’). (GH545)

  • Fix bug in variable names returned by forecast.py’s HRRR_ESRL model. (GH557)

  • Fixed bug in tracking.singleaxis that mistakenly assigned nan values when the Sun was still above the horizon. No effect on systems with axis_tilt=0. (GH569)

  • Source distribution did not contain LICENSE file. Added LICENSE, AUTHORS.md, and some docs to MANIFEST. (GH579)

  • Patch SPA C-files to fix timezone macro name clash with pyconfig.h. (GH168)


  • Expand testing section with guidelines for functions, PVSystem/Location objects, and ModelChain.

  • Updated several incorrect statements in ModelChain documentation regarding implementation status and default values. (GH480)

  • Expanded general contributing and pull request guidelines.

  • Added section on single diode equation with some detail on solutions used in pvlib-python (GH518)

  • Minor improvements and updates to installation documentation. (GH531)

  • Improve LocalizedPVSystem and LocalizedSingleAxisTracker documentation. (GH532)

  • Move the “Getting Started”/”Modeling Paradigms” section to a new top-level “Intro Examples” page.

  • Copy pvlib documentation’s “Getting support” section to README.md.

  • Add PVSystem documentation page. (GH514, GH319)

  • Add example of Kasten Linke Turbidity calculation, discuss broadband AOD and Angstrom Turbidity Model. (GH302)

  • Add JOSS paper to “Citing pvlib-python” section.


  • Add pytest-mock dependency

  • Use pytest-mock to ensure that PVSystem and ModelChain methods call corresponding functions correctly. Removes implicit dependence on precise return values of some function/methods. (GH394)

  • Additional test refactoring to limit test result dependence to a single function per test. (GH394)

  • Use pytest-mock to ensure that ModelChain DC model is set up correctly.

  • Add Python 3.7 to build matrix

  • Make test_forecast.py more robust. (GH293)

  • Improve test_atmosphere.py. (GH158)

  • Add LGTM.com integration. (GH554)

  • Add SticklerCI integration.

  • Add codecov integration.


v0.5.2 (May 13, 2018)#

API Changes#

  • removed unused ‘pressure’ arg from irradiance.liujordan function (GH386)

  • replaced logging.warning calls with warnings.warn calls, and removed logging.debug calls. We encourage users to explore tools such as pdb and trackback in place of the logging.debug calls. Fixes (GH447).


  • Improve clearsky.lookup_linke_turbidity speed, changing .mat source file to .h5 (GH437)

  • Updated libraries for CEC module parameters to SAM release 2017.9.5 (library dated 2017.6.30) and CEC inverter parameters to file posted to www.github.com/NREL/SAM on 2018.3.18, with one entry removed due to a missing parameter value. (:issue:’440’)

Bug fixes#

  • fixed redeclaration of test_simplified_solis_series_elevation (GH387)

  • physicaliam now returns a Series if called with a Series as an argument. (GH397)

  • corrected docstring for irradiance.total_irrad (:issue: ‘423’)

  • modified solar_azimuth_analytical to handle some borderline cases, thereby avoiding the NaN values and/or warnings that were previously produced (:issue: ‘420’)

  • removed RuntimeWarnings due to divide by 0 or nans in input data within irradiance.perez, clearsky.simplified_solis, pvsystem.adrinverter, pvsystem.ashraeiam, pvsystem.physicaliam, pvsystem.sapm_aoi_loss, pvsystem.v_from_i. (GH428)


  • Improve physicaliam doc string. (GH397)


  • Test Python 3.6 on Windows with Appveyor instead of 3.4. (GH392)

  • Fix failing test on pandas 0.22 (GH406)

  • Fix too large test tolerance (GH414)


  • Cliff Hansen

  • Will Holmgren

  • KonstantinTr

  • Anton Driesse

  • Cedric Leroy

v0.5.1 (October 17, 2017)#

API Changes#

  • pvsystem.v_from_i and pvsystem.i_from_v functions now accept resistance_series = 0 and/or resistance_shunt = numpy.inf as inputs (GH340)


  • Improve clearsky.lookup_linke_turbidity speed. (GH368)

  • Ideal devices supported in single diode model, e.g., resistance_series = 0 and/or resistance_shunt = numpy.inf (GH340)

  • pvsystem.v_from_i and pvsystem.i_from_v computations for near ideal devices are more numerically stable. However, very, very near ideal resistance_series and/or resistance_shunt may still cause issues with the implicit solver (GH340)

Bug fixes#

  • Remove condition causing Overflow warning from clearsky.haurwitz (GH363)

  • modelchain.basic_chain now correctly passes ‘solar_position_method’ arg to solarposition.get_solarposition (GH370)

  • Fixed: Variables and Symbols extra references not available (GH380)

  • Removed unnecessary calculations of alpha_prime in spa.solar_position_numpy and spa.solar_position_loop (GH366)

  • Fixed args mismatch for solarposition.pyephem call from solarposition.get_solarposition with method=’pyephem’ arg to solarposition.get_solarposition (GH370)

  • ModelChain.prepare_inputs and ModelChain.complete_irradiance now correctly pass the ‘solar_position_method’ argument to solarposition.get_solarposition (GH377)

  • Fixed usage of inplace parameter for tmy._recolumn (GH342)


  • Doc string of modelchain.basic_chain was updated to describe args more accurately. (GH370)

  • Doc strings of singlediode, pvsystem.v_from_i, and pvsystem.i_from_v were updated to describe acceptable input arg ranges. (GH340)


  • Changed test for clearsky.haurwitz to operate on zenith angles

  • Significant new test cases added for pvsystem.v_from_i and pvsystem.i_from_v (GH340)


  • Cliff Hansen

  • KonstantinTr

  • Will Holmgren

  • Mark Campanelli

  • DaCoEx

v0.5.0 (August 11, 2017)#

API Changes#

  • Removed parameter w from _calc_d (GH344)

  • SingleAxisTracker.get_aoi and SingleAxisTracker.get_irradiance now require surface_zenith and surface_azimuth (GH351)

  • Changes calculation of the Incidence Angle Modifier to return 0 instead of np.nan for angles >= 90°. This improves the calculation of effective irradiance close to sunrise and sunset. (GH338)

  • Change the default ModelChain orientation strategy from ‘south_at_latitude_tilt’ to None. (GH290)

Bug fixes#

  • Method of multi-inheritance has changed to make it possible to use kwargs in the parent classes of LocalizedPVSystem and LocalizedSingleAxisTracker (GH330)

  • Fix the __repr__ method of ModelChain, crashing when orientation_strategy is set to ‘None’ (GH352)

  • Fix the ModelChain’s angle of incidence calculation for SingleAxisTracker objects (GH351)

  • Fix issue with ForecastModel.cloud_cover_to_transmittance_linear method of forecast.py ignoring ‘offset’ parameter. (GH343)


  • Added default values to docstrings of all functions (GH336)

  • Added analytical method that calculates solar azimuth angle (GH291)


  • Added ModelChain documentation page

  • Added nbsphinx to documentation build configuration.

  • Added a pull request template file (GH354)


  • Added explicit tests for aoi and aoi_projection functions.

  • Update test of ModelChain.__repr__ to take in account GH352

  • Added a test for solar_azimuth_analytical function.


  • Johannes Kaufmann

  • Will Holmgren

  • Uwe Krien

  • Alaina Kafkes

  • Birgit Schachler

  • Jonathan Gaffiot

  • Siyan (Veronica) Guo

  • KonstantinTr

v0.4.5 (June 5, 2017)#

Bug fixes#

  • Fix pandas 0.20 incompatibilities in Location.get_clearsky, solarposition.ephemeris (GH325)

  • Fixes timezone issue in solarposition spa_c function (GH237)

  • Added NREL Bird clear sky model. (GH276)

  • Added lower accuracy formulas for equation of time, declination, hour angle and solar zenith.

  • Remove all instances of .ix (GH322)

  • Update docstring in pvlib.spa.solar_position - change units of pressure to millibars. NOTE: units of pressure in pvlib.solar_position.spa_python and pvlib.solar_position.spa_c are still Pascals. This update should have no effect on most users, since it only applies to the low-level spa.py module. (GH327)


  • Added irradiance.dni method that determines DNI from GHI and DHI and corrects unreasonable DNI values during sunrise/sunset transitions

  • ForecastModel will now only connect to the Unidata server when necessary, rather than when the object is created. This supports offline work and speeds up analysis of previously downloaded data.


  • Will Holmgren

  • Marc Anoma

  • Mark Mikofski

  • Birgit Schachler

v0.4.4 (February 18, 2017)#


  • Added Anton Driesse Inverter database and made compatible with pvsystem.retrieve_sam. (GH169)

  • Ported Anton Driesse Inverter model from PV_LIB Toolbox. (GH160)

  • Added Kasten pyrheliometric formula to calculate Linke turbidity factors with improvements by Ineichen and Perez to extend range of air mass (GH278)

  • Added coefficients for CIGS and a-Si modules types to the first_solar_spectral_correction function (GH308)

API Changes#

  • Change PVSystem default module_parameters and inverter_parameters to empty dict. Code that relied on these attributes being None or raising a TypeError will need to be updated. (issue:294)


  • Fixes the Forecasting page’s broken links to the tutorials.

  • Fixes the Forecasting page’s broken examples. (GH299)

  • Fixes broken Classes link in the v0.3.0 documentation.

Bug fixes#

  • Resolved several issues with the forecast module tests. Library import errors were resolved by prioritizing the conda-forge channel over the default channel. Stalled ci runs were resolved by adding a timeout to the HRRR_ESRL test. (GH293)

  • Fixed issue with irradiance jupyter notebook tutorial. (GH309)


  • Will Holmgren

  • Volker Beutner

  • Mark Mikofski

  • Anton Driesse

  • Mitchell Lee

v0.4.3 (December 28, 2016)#


  • Adding implementation of Perez’s DIRINDEX model based on existing DIRINT model implementation. (GH282)

  • Added clearsky.detect_clearsky function to determine the clear times in a GHI time series. (GH284)


  • Adds Python 3.6 to compatibility statement and pypi classifiers. (GH286)


  • Marc Anoma

  • Will Holmgren

  • Cliff Hansen

  • Tony Lorenzo

v0.4.2 (December 7, 2016)#

This is a minor release from 0.4.1.

Bug fixes#

  • Fixed typo in __repr__ method of ModelChain and in its regarding test.

  • PVSystem.pvwatts_ac could not use the eta_inv_ref kwarg and PVSystem.pvwatts_dc could not use the temp_ref kwarg. Fixed. (GH252)

  • Fixed typo in ModelChain.infer_spectral_model error message. (GH251)

  • Fixed Linke turbdity factor out of bounds error at 90-degree latitude or at 180-degree longitude (GH262)

  • Fixed Linke turbidity factor grid spacing and centers (GH263)

API Changes#

  • The run_model method of the ModelChain will use the weather parameter of all weather data instead of splitting it to irradiation and weather. The irradiation parameter still works but will be removed soon. (GH239)

  • delta_t kwarg is now 67.0 instead of None. IMPORTANT: Setting delta_t as None will break the code for the Numba accelerated calculations. This will be fixed in a future version. (GH165)


  • Adding a complete_irradiance method to the ModelChain to make it possible to calculate missing irradiation data from the existing columns [beta]. (GH239)

  • Added calculate_deltat method to the spa module to calculate the time difference between terrestrial time and UT1. Specifying a scalar is sufficient for most calculations. (GH165)

  • Added more attributes to ModelChain, PVSystem, and Location printed representations. (GH254)

  • Added name attribute to ModelChain and PVSystem. (GH254)

  • Restructured API section of the documentation so that there are separate pages for each function, class, or method. (GH258)

  • Improved Linke turbidity factor time interpolation with Python calendar month days and leap years (GH265)

  • Added option to return diffuse components from Perez transposition model.


  • Typical modeling results could change by ~1%, depending on location, if they depend on the turbidity table

  • Fixed issues with pvsystem, tracking, and tmy_to_power jupyter notebooks (GH267, GH273)

Code Contributors#

  • Uwe Krien

  • Will Holmgren

  • Volker Beutner

  • Mark Mikofski

  • Marc Anoma

  • Giuseppe Peronato

v0.4.1 (October 5, 2016)#

This is a minor release from 0.4.0. We recommend that all users upgrade to this version, especially if they want to use the latest versions of pandas.

Bug fixes#

  • Fixed an error in the irradiance.klucher transposition model. The error was introduced in version 0.4.0. (GH228)

  • Update RAP forecast model variable names. (GH241)

  • Fix incompatibility with pandas 0.19 and solar position calculations. (GH246)


  • Fixed a typo in the pvsystem.sapm returns description. (GH234)

  • Replaced nosetests references with py.test. (GH232)

  • Improve the rendering of the snlinverter doc string. (GH242)

Code Contributors#

  • Mark Mikofski

  • Johannes Dollinger

  • Will Holmgren

v0.4.0 (July 28, 2016)#

This is a major release from 0.3.3. We recommend that all users upgrade to this version after reviewing the API Changes. Please see the Bug Fixes for changes that will result in slightly different modeling results.

API Changes#

  • Remove unneeded module argument from singlediode function. (GH200)

  • In pvlib.irradiance.perez, renamed argument modelt to model. (GH196)

  • Functions in the irradiance module now work with scalar inputs in addition to arrays and Series. Furthermore, these functions no longer promote scalar or array input to Series output. Also applies to atmosphere.relativeairmass. (GH201, GH214)

  • Reorder the ashraeiam, physicaliam, and snlinverter arguments to put the most variable arguments first. Adds default arguments for the IAM functions. (GH197)

  • The irradiance.extraradiation function input/output type consistency across different methods has been dramatically improved. (GH217, GH219)

  • Updated to pvsystem.sapm to be consistent with the PVLIB MATLAB API. pvsystem.sapm now takes an effective irradiance argument instead of POA irradiances, airmass, and AOI. Implements closely related sapm_spectral_loss, sapm_aoi_loss, and sapm_effective_irradiance functions, as well as PVSystem methods. The sapm_aoi_loss function includes an optional argument to apply an upper limit to the output (output can be ~1% larger than 1 for AOI of ~30 degrees). (GH198, GH205, GH218)

  • The pvsystem.retrieve_sam keyword argument samfile has been replaced with path. A selection dialog window is now activated by not supplying any arguments to the function. The API for typical usage remains unchanged, however, the data will be loaded from a local file rather than the SAM website. (GH52)


  • Adds the First Solar spectral correction model. (GH115)

  • Adds the Gueymard 1994 integrated precipitable water model. (GH115)

  • Adds the PVWatts DC, AC, and system losses model. (GH195)

  • Improve PEP8 conformity in irradiance module. (GH214)

  • irradiance.disc is up to 10x faster. (GH214)

  • Add solarposition.nrel_earthsun_distance function and option to calculate extraterrestrial radiation using the NREL solar position algorithm. (GH211, GH215)

  • pvsystem.singlediode can now calculate IV curves if a user supplies an ivcurve_pnts keyword argument. (GH83)

  • Includes SAM data files in the distribution. (GH52)

  • ModelChain now implements SAPM, PVWatts, Single Diode and user-defined modeling options. See Will Holmgren’s ModelChain refactor gist for more discussion about new features in ModelChain. (GH143, GH194)

  • Added forecast.py module for solar power forecasts. (GH86, GH124, GH180)

Bug fixes#

  • Fixed an error in pvsystem.singlediode’s i_mp, v_mp, and p_mp calculations when using array or Series input. The function wrongly returned solutions when any single point is within the error tolerance, rather than requiring that the solution for all points be within the error tolerance. Results in test scenarios changed by 1-10%. (GH221)

  • Fixed a numerical overflow error in pvsystem.singlediode’s v_oc determination for some combinations of parameters. (GH225)

  • dirint function yielded the wrong results for non-sea-level pressures. Fixed. (GH212)

  • Fixed a bug in the day angle calculation used by the ‘spencer’ and ‘asce’ extraterrestrial radiation options. Most modeling results will be changed by less than 1 part in 1000. (GH211)

  • irradiance.extraradiation now raises a ValueError for invalid method input. It previously failed silently. (GH215)


  • Added new terms to the variables documentation. (GH195)

  • Added clear sky documentation page.

  • Fix documentation build warnings. (GH210)

  • Removed an unneeded note in irradiance.extraradiation. (GH216)


  • pvlib-python is now available on the conda-forge channel: conda install pvlib-python -c conda-forge (GH154)

  • Switch to the py.test testing framework. (GH204)

  • Reconfigure Appveyor CI builds and resolve an issue in which the command line length was too long. (GH207)

  • Manually build numpy and pandas for the min requirements test. This is needed to avoid Continuum’s bad practice of bundling scipy with pandas. (GH214)


  • pvlib now requires pandas >= 0.14.0 and numpy >= 1.9.0, both released in 2014. Most of pvlib will work with lesser versions. (GH214)

Code Contributors#

  • Will Holmgren

  • Jonathan Chambers

  • Mitchell Lee

  • Derek Groenendyk

v0.3.3 (June 15, 2016)#

This is a minor release from 0.3.2. We recommend that all users upgrade to this version.

API Changes#

  • Renamed series_modules to modules_per_string and parallel_modules to strings_per_inverter. (GH176)

  • Changed two of the TMY3 data reader fields for consistency with the rest of the fields and with PVLIB MATLAB. Changed ‘PresWth source’ to ‘PresWthSource’, and ‘PresWth uncert’ to ‘PresWthUncertainty’. (GH193)


  • Adds the Erbs model. (GH2)

  • Adds the scale_voltage_current_power function and PVSystem method to support simple array modeling. (GH159)

  • Adds support for SingleAxisTracker objects in ModelChain. (GH169)

  • Add __repr__ method to PVSystem, LocalizedPVSystem, ModelChain, SingleAxisTracker, Location. (GH142)

  • Add v_from_i function for solving the single diode model. (GH190)

  • Improve speed of singlediode function by using v_from_i to determine v_oc. Speed is ~2x faster. (GH190)

  • Adds the Simplified Solis clear sky model. (GH148)

Bug fixes#

  • Fix another bug with the Appveyor continuous integration builds. (GH170)

  • Add classifiers to setup.py. (GH181)

  • Fix snlinverter and singlediode documentation. They incorrectly said that inverter/module must be a DataFrame, when in reality they can be any dict-like object. (GH157)

  • Fix numpy 1.11 deprecation warnings caused by some functions using non-integer indices.

  • Propagate airmass data through ModelChain’s get_irradiance call so that the perez model can use it, if necessary. (GH172)

  • Fix problem in which the perez function dropped nighttime values. Nighttime values are now set to 0. (GH191)


  • Localize datetime indices in package overview examples. (GH156)

  • Clarify that ModelChain and basic_chain currently only supports SAPM. (GH177)

  • Fix version number in 0.3.2 whatsnew file.

  • Shorten README.md file and move information to official documentation. (GH182)

  • Change authors to PVLIB Python Developers and clean up setup.py. (GH184)

  • Document the PresWth, PresWthSource, and PresWthUncertainty fields in the TMY3 data reader. (GH193)


  • Removed test skip decorator functions for Linux + Python 3 and for pandas 0.18.0. (GH187)


  • Will Holmgren

  • Mark Mikofski

  • Johannes Oos

  • Tony Lorenzo

v0.3.2 (May 3, 2016)#

This is a minor release from 0.3.1. We recommend that all users upgrade to this version.

Bug fixes#

  • Updates the SAM file URL. (GH152)


  • Will Holmgren

v0.3.1 (April 19, 2016)#

This is a minor release from 0.3.0. We recommend that all users upgrade to this version.


  • Added versioneer to keep track of version changes instead of manually updating pvlib/version.py. This will aid developers because the version string includes the specific git commit of the library code currently imported. (issue:150)

Bug fixes#

  • Fixes night tare issue in snlinverter. When the DC input power (p_dc) to an inverter is below the inversion startup power (Ps0), the model should set the AC output (ac_power) to the night tare value (Pnt). The night tare power indicates the power consumed by the inverter to sense PV array voltage. The model was erroneously comparing Ps0 with the AC output power (ac_power), rather than the DC input power (p_dc). (GH140)

  • Fixed the azimuth calculation of rotated PV panel in function pvlib.tracking.singleaxis(…) so that the results are consistent with PVsyst. (GH144)


  • ejmiller2

  • Yudong Ma

  • Tony Lorenzo

  • Will Holmgren

v0.3.0 (March 21, 2016)#

This is a major release from 0.2.2. It will almost certainly break your code, but it’s worth it! We recommend that all users upgrade to this version after testing their code for compatibility and updating as necessary.

API changes#

  • The location argument in solarposition.get_solarposition and clearsky.ineichen has been replaced with latitude, longitude, altitude, and tz as appropriate. This separates the object-oriented API from the procedural API. (GH17)

  • Location classes gain the get_solarposition, get_clearsky, and get_airmass functions.

  • Adds ModelChain, PVSystem, LocalizedPVSystem, SingleAxisTracker, and LocalizedSingleAxisTracker classes. (GH17)

  • Location objects can be created from TMY2/TMY3 metadata using the from_tmy constructor.

  • Change default Location timezone to 'UTC'.

  • The solar position calculators now assume UTC time if the input time is not localized. The calculators previously tried to infer the timezone from the now defunct location argument.

  • pvsystem.sapm_celltemp argument names now follow the variable conventions.

  • irradiance.total_irrad now follows the variable conventions. (GH105)

  • atmosphere.relativeairmass now raises a ValueError instead of assuming 'kastenyoung1989' if an invalid model is supplied. (GH119)


  • Added new sections to the documentation:

  • Adds support for Appveyor, a Windows continuous integration service. (GH111)

  • The readthedocs documentation build now uses conda packages instead of mock packages. This enables code to be run and figures to be generated during the documentation builds. (GH104)

  • Reconfigures TravisCI builds and adds e.g. has_numba decorators to the test suite. The result is that the TravisCI test suite runs almost 10x faster and users do not have to install all optional dependencies to run the test suite. (GH109)

  • Adds more unit tests that test that the return values are actually correct.

  • Add atmosphere.APPARENT_ZENITH_MODELS and atmosphere.TRUE_ZENITH_MODELS to enable code that can automatically determine which type of zenith data to use e.g. Location.get_airmass.

  • Modify sapm documentation to clarify that it does not work with the CEC database. (GH122)

  • Adds citation information to the documentation. (GH73)

  • Updates the comparison_pvlib_matlab documentation. (GH116)

Bug fixes#

  • Fixed the metadata key specification in documentation of the readtmy2 function.

  • Fixes the import of tkinter on Python 3 (GH112)

  • Add a decorator to skip test_calcparams_desoto on pandas 0.18.0. (GH130)

  • Fixes i_from_v documentation. (GH126)

  • Fixes two minor sphinx documentation errors: a too short heading underline in whatsnew/v0.2.2.txt and a table format in pvsystem. (GH123)


  • Will Holmgren

  • pyElena21

  • DaCoEx

  • Uwe Krien

Will Holmgren, Jessica Forbess, bmu, Cliff Hansen, Tony Lorenzo, Uwe Krien, and bt- contributed to the object model discussion.

v0.2.2 (November 13, 2015)#

This is a minor release from 0.2.1. We recommend that all users upgrade to this version.


  • Adds Python 3.5 compatibility (GH87)

  • Moves the Linke turbidity lookup into clearsky.lookup_linke_turbidity. The API for clearsky.ineichen remains the same. (GH95)

Bug fixes#

  • irradiance.total_irrad had a typo that required the Klucher model to be accessed with 'klutcher'. Both spellings will work for the remaining 0.2.* versions of pvlib, but the misspelled method will be removed in 0.3. (GH97)

  • Fixes an import and KeyError in the IPython notebook tutorials (GH94).

  • Uses the logging module properly by replacing format calls with args. This results in a 5x speed increase for tracking.singleaxis (GH89).

  • Adds a link to the 2015 PVSC paper (GH81)


  • Will Holmgren

  • jetheurer

  • dacoex

v0.2.1 (July 16, 2015)#

This is a minor release from 0.2. It includes a large number of bug fixes for the IPython notebook tutorials. We recommend that all users upgrade to this version.


  • Update component info from SAM (csvs dated 2015-6-30) (GH75)

Bug fixes#

  • Fix incorrect call to Perez irradiance function (GH76)

  • Fix numerous bugs in the IPython notebook tutorials (GH30)


  • Will Holmgren

  • Jessica Forbess

v0.2.0 (July 6, 2015)#

This is a major release from 0.1 and includes a large number of API changes, several new features and enhancements along with a number of bug fixes. We recommend that all users upgrade to this version.

Due to the large number of API changes, you will probably need to update your code.

API changes#

  • Change variable names to conform with new Variables and style rules wiki. This impacts many function declarations and return values. Your existing code probably will not work! (GH37, GH54).

  • Move dirint and disc algorithms from clearsky.py to irradiance.py (GH42)

  • Mark some pvsystem.py methods as private (GH20)

  • Make output of pvsystem.sapm_celltemp a DataFrame (GH54)


  • Add conda installer

  • PEP8 fixups to solarposition.py and spa.py (GH50)

  • Add optional projection_ratio keyword argument to the haydavies calculator. Speeds calculations when irradiance changes but solar position remains the same (GH58)

  • Improved installation instructions in README.

Bug fixes#

  • fix local build of the documentation (GH49, GH56)

  • The release date of 0.1 was fixed in the documentation (see v0.1.0 (April 20, 2015))

  • fix casting of DateTimeIndex to int64 epoch timestamp on machines with 32 bit python int (GH63)

  • fixed some docstrings with failing doctests (GH62)


  • Will Holmgren

  • Rob Andrews

  • bmu

  • Tony Lorenzo

v0.1.0 (April 20, 2015)#

This is the first official release of the pvlib-python project. As such, a “What’s new” document is a little hard to write. There will be significant overlap with the to-be-written document that describes the differences between pvlib-python and PVLIB_Matlab.

API changes#

  • Remove pvl_ from module names.

  • Consolidation of similar modules. For example, functions from pvl_clearsky_ineichen.py and pvl_clearsky_haurwitz.py have been consolidated into clearsky.py.

  • Return one DataFrame instead of a tuple of DataFrames.

  • Change function and module names so that they do not conflict.

New features#

  • Library is Python 3.3 and 3.4 compatible

  • Add What’s New section to docs (GH10)

  • Add PyEphem option to solar position calculations.

  • Add a Python translation of NREL’s SPA algorithm.

  • irradiance.py has more AOI, projection, and irradiance sum and calculation functions

  • TMY data import has a coerce_year option

  • TMY data can be loaded from a url (GH5)

  • Locations are now pvlib.location.Location objects, not “structs”.

  • Specify time zones using a string from the standard IANA Time Zone Database naming conventions or using a pytz.timezone instead of an integer GMT offset. We may add dateutils support in the future.

  • clearsky.ineichen supports interpolating monthly Linke Turbidities to daily resolution.

Other changes#

  • Removed Vars=Locals(); Expect...; var=pvl\_tools.Parse(Vars,Expect); pattern. Very few tests of input validitity remain. Garbage in, garbage or nan out.

  • Removing unnecssary and sometimes undesired behavior such as setting maximum zenith=90 or airmass=0. Instead, we make extensive use of nan values.

  • Adding logging calls, removing print calls.

  • Improved PEP8 compliance.

  • Added /pvlib/data for lookup tables, test, and tutorial data.

  • Limited the scope of clearsky.py’s scipy dependency. clearsky.ineichen will work without scipy so long as the Linke Turbidity is supplied as a keyword argument. (GH13)

  • Removed NREL’s SPA code to comply with their license (GH9).

  • Revised the globalinplane function and added a test_globalinplane (GH21, GH33).


  • Using readthedocs for documentation hosting.

  • Many typos and formatting errors corrected (GH16)

  • Documentation source code and tutorials live in / rather than /pvlib/docs.

  • Additional tutorials in /docs/tutorials.

  • Clarify pvsystem.systemdef input (GH17)


  • Tests are cleaner and more thorough. They are still nowhere near complete.

  • Using Coveralls to measure test coverage.

  • Using TravisCI for automated testing.

  • Using nosetests for more concise test code.

Bug fixes#

  • Fixed DISC algorithm bugs concerning modifying input zenith Series (GH24), the Kt conditional evaluation (GH6), and ignoring the input pressure (GH25).

  • Many more bug fixes were made, but you’ll have to look at the detailed commit history.

  • Fixed inconsistent azimuth angle in the ephemeris function (GH40)


This list includes all (I hope) contributors to pvlib/pvlib-python, Sandia-Labs/PVLIB_Python, and UARENForecasting/PVLIB_Python.

  • Rob Andrews

  • Will Holmgren

  • bmu

  • Tony Lorenzo

  • jforbess

  • Jorissup

  • dacoex

  • alexisph

  • Uwe Krien