Changelog#
4.0.0 - 2026-01-30#
GWpy 4.0.0 represents a major version release with significant improvements to I/O, logging, and signal processing, as well as modernization of dependencies, and several breaking changes. The source code has been significantly refactored to include type annotations throughout, and to improve code quality in order to improve maintainability.
The project online documentation has been restructured and relocated to https://gwpy.readthedocs.io/ and now includes a full API reference, and improved User Guide and Examples.
This release includes over 1,000 commits since the last release.
Breaking Changes#
Python 3.11 is now the minimum supported version, and support for Python 3.14 has been added.
The I/O system used by GWpy to support
.read()and.write()methods in all classes has been completely rewritten to use the updated class-based Astropy I/O Registry (astropy.io.registry).Additionally, the builtin parallel I/O support has been reworked to use multiple threads, controlled via the
parallelkeyword argument, rather than multiple processes (vianproc).Existing custom I/O read/write function registrations may need to be updated to register to a new custom registry, or to use the new
gwpy.io.registry.default_registryinstance.The
TimeSeries(and friends)getmethod has been with its own registry of supported data sources, and will now try each data source in turn until data are found.A
sourcekeyword argument has been added to allow specifying one or more data sources to try, or to restrict to a single source.Some existing usage may need to be updated to work with this new API.
See Data Discovery for more details.
GWpy now uses igwn-ligolw instead of
python-ligo-lwfor LIGO_LW XML file handling.The APIs should be the same, but the objects used internally and returned by functions in the
gwpy.io.ligolwandgwpy.<subpackage>.io.ligolwsubmodules have changed to theigwn_ligolwequivalents.The
gwpy.signal.filter_designmodule has been significantly updated.The
gwpy.signal.filter_design.bilinear_zpkfunction has been removed in favour ofscipy.signal.bilinear_zpk, and theparse_filterfunction now has an updated API.All filter_design and filter application functions and methods throughout GWpy now default to digital filters in rad/s units, to match the behaviour of
scipy.signalfunctions.The
gwpy.io.mpmodule was removed in favour of the multiprocessing utilities provided by the Python standard library, i.e.,multiprocessingandconcurrent.futures.
See Expired Deprecations below for more details of other breaking changes related to removed deprecated features.
Deprecations#
The
gwpy.utils.decorators.deprecated_propertydecorator is now deprecated and will be removed in a future release. Use thewarnings.deprecateddecorator instead.The
TimeSeries.fetch,TimeSeries.fetch_open_data, andTimeSeries.findmethods are all now simple wrappers around the unifiedTimeSeries.getmethod, with appropriate default values for thesourcekeyword.These methods are not currently deprecated, but may be in a future release.
The
urlkeyword argument inDataQualityDict.query_dqsegdbhas been renamed tohostto better reflect its purpose. Theurlkeyword is now deprecated and will be removed in a future release.The
krb5ccnameargument togwpy.io.kerberos.kinitwas renamed toccacheto better reflect its purpose. Thekrb5ccnamekeyword is now deprecated and will be removed in a future release.The
verboseargument to most GWpy functions and methods is now deprecated and will be removed in future releases. Use thegwpy.logmodule to configure logging instead.The
nprocargument to most.read()classmethods was renamed toparallelto better reflect its purpose. Thenprockeyword is now deprecated and will be removed in a future release.The
gwpy.io.utils.gopenfunction is now deprecated and will be removed in a future release. Use the built-ingzip.openfunction instead.The
flagkeyword argument toDataQualityFlag.readwas renamed tonameto better reflect its purpose. Theflagkeyword is now deprecated and will be removed in a future release.The
gwpy.signal.window.planckfunction is now deprecated and will be removed in a future release. Use a different windowing function instead.The
selectionkeyword toEventTable.read,EventTable.fetchand similar methods was renamed towhereto better reflect its purpose. Theselectionkeyword is now deprecated and will be removed in a future release.
Expired Deprecations#
The deprecated
FrequencySeries.filterbamethod was removed, useFrequencySeries.filterinstead.The deprecated
gwpy.io.cache.open_cachefunction was removed, usegwpy.io.cache.read_cacheinstead.The deprecated
gwpy.io.cache.file_namefunction was removed, usegwpy.io.utils.file_pathinstead.The deprecated
gwpy.io.cache.file_listfunction was removed, usegwpy.io.utils.file_listinstead.The deprecated
c_sortkeyword argument togwpy.plot.Axesmethods was removed, usesortbycolorinstead.The deprecated
gwpy.signal.fftmodule was removed/The deprecated
EventTable.plotmethod was removed, useEventTable.scatterinstead.The deprecated
gwpy.utils.misc.null_contextfunction was removed, usecontextlib.nullcontextinstead.The deprecated
gwpy.utils.shell.whichfunction was removed, useshutil.whichinstead.The deprecated
gwpy.utils.shell.callfunction was removed, usesubprocess.runinstead.
New Features#
A new
gwpy-rdscommand line tool has been added for getting timeseries data and writing to a new ‘reduced data set’ (RDS). See Creating reduced datasets with GWpy for more details.A new
gwpy-tconvertcommand line tool has been added for converting to and from GPS times. See Converting GPS times with GWpy for more details.A new
gwpy.logmodule has been added for general support for log messages throughout GWpy and user code. This module supports automatic configuration of logging from the environment. See Logging with GWpy for more details.Almost all GWpy modules now use this logging module instead of internal
printstatements triggered by averbosekeyword.All GWF writing operations now support the
overwritekeyword (default isTrue) to support explicitly allowing or disabling overwriting existing files.Support for reading
TimeSeriesdata from an Arrakis data block was added. See the newTimeSeries.from_arrakismethod for details.All GWpy
read()calls now support reading directly from URLs, includinghttp{s}. Files are downloaded using Downloadable Data Management (astropy.utils.data).All GWpy
read()methods now support reading from Pelican URLs. These may required authorisation tokens, depending on the URL, and so support has been added for dynamically discovering SciTokens from the host system.The
gwpy.io.gwfmodule has been refactored to provide a generic API for reading and writing GWF files using multiple backends.Support has been added for using LALFrame as a backend for GWF I/O.
The default GWF I/O backend can noe be configured using the
GWPY_FRAME_LIBRARYenvironment variable. See Configuring GWpy from the environment for more details.
Bug Fixes#
Fix masking of GWOSC catalog data in
Table.fetch_open_data[gwpy/gwpy!1854]
Other Changes#
gwpy.time.from_gps(),:func:`gwpy.time.tconvert, and other time-conversion functions now return timezone-awaredatetime.datetimeobjects in UTC [gwpy/gwpy!1977]Update
namereturned for GWOSC HDF5 data [gwpy/gwpy!1963]Improvements to
Series.injectmethod [gwpy/gwpy!1962]Refactor project documentation [gwpy/gwpy!1952]
Plots made with gwpy-plot will automatically use the GW Observatory Colour Scheme if the data are determined to be from one or more GW observatories.
Kerberos authentication utilities in
gwpy.io.kerberosare now implemented using python-gssapi, instead of calling out to thekinitcommand line tool.This should not present any breaking changes to users, but error messages may be different in some cases.
3.0.14 - 2026-01-16#
Patch release.
Bug Fixes#
Fix compatibility with Scipy 1.17 [gwpy/gwpy!1981]
Improve the GWpyFormat unit parser [gwpy/gwpy!1954]
Fix usage of chained classmethod decorator [gwpy/gwpy!1906]
Other Changes#
Add support for Python 3.13 [gwpy/gwpy!1905]
3.0.13 - 2025-07-02#
Patch release.
Bug Fixes#
Fix incompatibility with numpy 2.3.x [gwpy/gwpy!1896]
Work around bug in
scipy.signal.csd()[gwpy/gwpy!1893]Fix unit parsing with Astropy 7.1 [gwpy/gwpy!1877]
Fix a bug with
DataQualityFlagsubtraction & revise a few tests [gwpy/gwpy!1703]Add missing
detection_snrargument in call togwpy.astro.inspiral_range[gwpy/gwpy!1615]
Other Changes#
Pin to python-ligo-lw <2.0.0 [gwpy/gwpy!1899]
Don’t set number attribute for
gwpy.plot.Plot[gwpy/gwpy!1834]Typos in doc [gwpy/gwpy!1778]
3.0.12 - 2025-02-06#
Patch release.
API Changes#
Add support for timeout in
fetch_open_data[gwpy/gwpy!1832]
3.0.11 - 2025-01-14#
This release fixes a few bugs and solves compatibility issues with the latest release of Matplotlib.
API Changes#
Migrate from ligo-segments to igwn-segments [gwpy/gwpy!1819]
Bug Fixes#
Fix version comparisons in
gwpy.plot[gwpy/gwpy!1799]
Other Changes#
Changes:
Drop support for Python 3.8 [gwpy/gwpy!1802]
Remove all use of CVMFS for data in tests [gwpy/gwpy!1821]
3.0.10 - 2024-08-30#
This release fixes a few bugs and solves compatibility issues with the latest release of NumPy.
API Changes#
Modify coherence unit to be an alias for
dimensionless_unscaled[gwpy/gwpy!1779]Raise
NotImplementedErrorfrom StateTimeSeries.override_unit when attempting to change to an unsupported unit [gwpy/gwpy!1787]
Bug Fixes#
Fix use of numpy types for v2.0 [gwpy/gwpy!1782]
Fix implicit array to scalar conversion in filter design [gwpy/gwpy!1780]
Update import of
interactive_bkfor Matplotlib 3.9 [gwpy/gwpy!1770]
Other Changes#
Skip
ReadTimeouterrors as standard for network tests [gwpy/gwpy!1775]Fix a few minor warnings emitted by Sphinx builds [gwpy/gwpy!1772]
Fix man warnings in tests [gwpy/gwpy!1784]
Use ID tokens for PyPI upload [gwpy/gwpy!1783]
Skip tests that fail with 502 Bad Gateway errors from Zenodo.org [gwpy/gwpy!1774]
Use
release-branch-semverscheme with setuptools-scm [gwpy/gwpy!1786]Update all references to github.com [gwpy/gwpy!1773]
Add
K1_HOFT_C00frametype description in documentation [gwpy/gwpy!1789]
3.0.9 - 2024-07-13#
Patch release.
This release fixes a few bugs and resolves compatibility issues with the latest releases of NumPy and SciPy.
Bug Fixes#
Fix argument reuse bug in
gwpy.cli[gwpy/gwpy!1747]Fix usage of Hann window for Scipy 1.13.0 [gwpy/gwpy!1753]
Fix test failure with Zenodo rate limit [gwpy/gwpy!1755]
Fix array copy compatibility with numpy 2 [gwpy/gwpy!1760]
Fix usage of Scipy firwin [gwpy/gwpy!1762]
Fix usage of Scipy trapezoid in gwpy.astro [gwpy/gwpy!1763]
Other Changes#
Changes:
Support parsing multiple FFL files for a single dataset [gwpy/gwpy!1616]
Remove redundant usetex test function [gwpy/gwpy!1637]
Add tests for
gwpy.timeseries.io.cache[gwpy/gwpy!1641]Add Virgo ‘HoftOnline’ as a preferred frametype [gwpy/gwpy!1749]
Improve error handling when reading GWF with LALFrame [gwpy/gwpy!1764]
Add extra unit alias for ‘s’ [gwpy/gwpy!1765]
3.0.8 - 2024-01-12#
Patch release.
Bug Fixes#
Fix bug in
TimeSeriesDict.find[gwpy/gwpy!1672]Fix array indexing of
Series.xindex[gwpy/gwpy!1685]Fix missing sample when reading with non-exact sample times using LALFrame [gwpy/gwpy!1694]
Fix bugs in inverse FFT normalisation [gwpy/gwpy!1728]
Other Changes#
Sieve URLs from gwosc client before fetch [gwpy/gwpy!1665]
Handle reading
LIGO_LWXML files that are missing the_nstiming columns. [gwpy/gwpy!1669]Silence LAL
LIGOTimeGPSwarnings when parsing a cache [gwpy/gwpy!1688]Use class fixtures to download GWOSC data that is used many times [gwpy/gwpy!1691]
Replace
mayawithdateparseringwpy.time[gwpy/gwpy!1695]Fix coherence test fixture [gwpy/gwpy!1698]
Fix the Zenodo RST utility module [gwpy/gwpy!1699]
Drop
HAS_TEXfor faster startup time [gwpy/gwpy!1712]Track LALSuite rebrand in docs [gwpy/gwpy!1713]
Add support for Python 3.12 [gwpy/gwpy!1714]
Avoid python-framel 8.46.0 [gwpy/gwpy!1715]
Migrate test requirement to pytest-freezer [gwpy/gwpy!1716]
Remove all use of distutils [gwpy/gwpy!1718]
Replace
datetime.utcnowwithdatetime.now(UTC)[gwpy/gwpy!1719]Add aliases for LIGO and Virgo’s ‘time’ units [gwpy/gwpy!1721]
Read the unitX from a GWF with frameCPP [gwpy/gwpy!1722]
Allow localhost sockets during dist testing [gwpy/gwpy!1723]
Propagate source keyword in
DataQualityDict.populate[gwpy/gwpy!1725, gwpy/gwpy!1730]Update documentation references for lscsoft-glue and LALSuite [gwpy/gwpy!1733]
Replace
sphinx-panelstabs withsphinx-immaterialtabs [gwpy/gwpy!1734]
3.0.7 - 2023-10-05#
Build fix release.
The distributions for GWpy 3.0.6 were corrupted, so 3.0.7 replaces that release.
There are no code changes in 3.0.7 relative to 3.0.6
3.0.6 - 2023-10-05#
Patch release.
Bug Fixes#
Fix type comparison lint [gwpy/gwpy!1654]
Fix compatibility with matplotlib 3.8.0 [gwpy/gwpy!1661]
Other Changes#
Drop support for Python 3.7 [gwpy/gwpy!1636]
Don’t round
TimeSeries.dtwhen setting viasample_rate[gwpy/gwpy!1649]Improve tests of
TimeSeriesDict.finderror handling [gwpy/gwpy!1676]Fix all executable lint issues [gwpy/gwpy!1677]
3.0.5 - 2023-06-02#
Patch release.
Bug Fixes#
Fix issues writing
StateVector.bitsto HDF5 [gwpy/gwpy!1608]Fix plotting
TimeSeriesDicton separate Axes [gwpy/gwpy!1610]Fix issues with
Series.cropprecision [gwpy/gwpy!1621]Address inconsistency in
transfer_functionbetween CSD and PSD averaging methods [gwpy/gwpy!1619]
Other Changes#
Update all GWOSC URLs to gwosc.org [gwpy/gwpy!1613]
Resample time series for coherence calculation when sampling rates differ [gwpy/gwpy!1611]
Update
LatexInlineDimensionalunit formatter for Astropy 5.3 [gwpy/gwpy!1622]Document the
copykeyword forTimeSeriesBaseDict.crop[gwpy/gwpy!1617]Add H0 and L0 to dynamic_scaled exclusion list [gwpy/gwpy!1628]
3.0.4 - 2023-04-12#
Bug fix release.
Bug Fixes#
Fix incompatibility with gwosc 0.7.0 [gwpy/gwpy!1606]
3.0.3 - 2023-04-09#
Bug fix release.
Bug Fixes#
Fix incompatibilities with matplotlib 3.7.0 [gwpy/gwpy!1586]
Fix incorrect phase for transfer function calculation [gwpy/gwpy!1590]
Address floating point errors for index creation [gwpy/gwpy!1600]
Other Changes#
Update usage of
pytest.raisesthroughout the codebase [gwpy/gwpy!1542]Improve handling/propagation of maya/dateparser errors and refactor
gwpy.timetests [gwpy/gwpy!1559]Improve documentation of GWF I/O libraries [gwpy/gwpy!1563]
Update import of
matplotlib.docstrings[gwpy/gwpy!1566]Update a number of CLI examples to use GWTC-3 data [gwpy/gwpy!1567]
Update GWF writing for frameCPP 3.0.0 [gwpy/gwpy!1575]
Add wrapper around
scipy.signal.get_windowto handle pre-computed window arrays [gwpy/gwpy!1576]Gracefully skip
requests.exceptions.ConnectionErrorin testing [gwpy/gwpy!1577]Improve NDSWarning message emitted by
TimeSeriesDict.fetch[gwpy/gwpy!1578]Replace usage of deprecated
matplotlib.ticker.is_close_to_int[gwpy/gwpy!1579]Enhance LaTeX detection [gwpy/gwpy!1585]
Update qscan example [gwpy/gwpy!1587]
Replace deprecated
interp2dwithRectBivariateSpline[gwpy/gwpy!1602]
3.0.2 - 2022-11-24#
Bug Fixes#
Fix reading ILWD chars from LIGO_LW XML with python-ligo-lw [gwpy/gwpy!1570]
Other Changes#
Declare support for Python 3.11 [gwpy/gwpy!1555]
3.0.1 - 2022-11-08#
Bug-fix release for 3.0.x.
Bug Fixes#
Fix Python 3.11 compatibility in
gwpy.io.nds2[gwpy/gwpy!1558]
Other Changes#
Handle optional kerberos with requests-ecp [gwpy/gwpy!1554]
3.0.0 - 2022-10-04#
Major feature release.
Deprecations#
gwpy.testing.utils.skip_missing_dependencyis now deprecated and will be removed in a future release [gwpy/gwpy!1531]
Expired Deprecations#
Remove support for S6-style SegDB server [gwpy/gwpy!1356]
Remove support for
hdf5.loscfile format key [gwpy/gwpy!1465]Remove
gwpy.table.EventColum[gwpy/gwpy!1466]Remove deprecated
Plotmethods [gwpy/gwpy!1467]Remove deprecated colorbar behaviour [gwpy/gwpy!1468]
Remove deprecated
SegmentAxesmethods [gwpy/gwpy!1469]Remove deprecated
TimeSeries.readoptions for GWF [gwpy/gwpy!1470]Remove deprecated
Spectrogram.plotkeyword [gwpy/gwpy!1472]
New Features#
Add support for reading GstLAL trigger files [gwpy/gwpy!1265]
Add support for filter functions to use multiple columns with
EventTable.filter[gwpy/gwpy!1391]Add
TimeSeries.transfer_function[gwpy/gwpy!1406]Support writing ROOT files with
uproot4[gwpy/gwpy!1419]
API Changes#
Refactor gwpy.astro to depend on inspiral-range [gwpy/gwpy!1284]
Update API for
gwpy.utils.lal.to_lal_unitfunction [gwpy/gwpy!1479]Remove equivalence between
strainanddimensionless_unscaledunits [gwpy/gwpy!1477]Update
Axes.tileto usesortbycolorkeyword [gwpy/gwpy!1483]
Other Changes#
Improve handling of empty arrays when writing GWF with LALFrame [gwpy/gwpy!1501]
Use
pytest.mark.requiresin all tests [gwpy/gwpy!1531]Improve PyCBC HDF5 table reading [gwpy/gwpy!1543]
A number of bugs were fixed, and compatibility improved with advanced versions of the requirements.
2.1.5 - 2022-08-01#
Patch release for GWpy 2.1.x.
Bug Fixes#
Fix compatibility with scipy 1.9.0 [gwpy/gwpy!1521]
Deprecate the
gwpy.utils.null_contextfunction [gwpy/gwpy!1523]
Other Changes#
Fix some lint [gwpy/gwpy!1530]
2.1.4 - 2022-06-27#
Bug Fixes#
handle cases in
EventTable.cluster()where table is empty or already clustered [gwpy/gwpy!1363]fix bug in
Seriesindex comparison [gwpy/gwpy!1428]fix bug reading ASCII Files [gwpy/gwpy!1474]
resolve
DeprecationWarningfrom SciPy 1.8.0 [gwpy/gwpy!1484]fix reading a contiguous set of files with LALFrame [gwpy/gwpy!1487]
migrate GWDataFind interface to new UI [gwpy/gwpy!1499]
update name of Gravity Spy server for glitch tables [gwpy/gwpy!1512]
work around a bug in frameCPP [gwpy/gwpy!1517]
Other Changes#
Python >=3.7 [gwpy/gwpy!1441]
h5py >=2.8.0 [gwpy/gwpy!1441]
Astropy >=4.0 [gwpy/gwpy!1463]
NumPy >=1.16 [gwpy/gwpy!1463]
GWDataFind >=1.1.0 [gwpy/gwpy!1499]
2.1.3 - 2021-12-17#
Patch release for GWpy 2.1.x.
Bug Fixes#
update test suite to use tmp_path fixture in pytest [gwpy/gwpy!1401]
add support for Python 3.10 [gwpy/gwpy!1418]
fix DeprecationWarning emitted in Python 3.10 [gwpy/gwpy!1439]
update timeseries/public example [gwpy/gwpy!1438]
decorate test to skip gracefully on network error [gwpy/gwpy!1456]
fix compatibility with python-ligo-lw 1.8.0 [gwpy/gwpy!1457]
fix compatibility with scipy 1.8.0 [gwpy/gwpy!1458]
2.1.2 - 2021-11-25#
Patch release for GWpy 2.1.x.
Deprecations#
gwpy.utils.shell.which()is now deprecated [gwpy/gwpy!1411]
Bug Fixes#
writing a
TimeSerieswith nonameto GWF now has consistent behaviour across all GWF APIs [gwpy/gwpy!1425]fixed compatibility with Astropy 5.0 [gwpy/gwpy!1435]
2.1.1 - 2021-10-18#
Patch release.
Deprecations#
gwpy.utils.shell.call()is now deprecated [gwpy/gwpy!1412]
API Changes#
a
strictkeyword was added togwpy.io.cache.sieve()[gwpy/gwpy!1417]
Bug Fixes#
Series.crop()can now handle irregular indices (thanks @mattpitkin!) [gwpy/gwpy!1414]TimeSeries.readno longer checks thetRangeof anFrProcDatawhen reading GWF using FrameCPP [gwpy/gwpy!1420]
2.1.0 - 2021-08-30#
Deprecations#
the
gwpy.testing.utils.TemporaryFilecontext manager is now deprecated [gwpy/gwpy!1353]gwpy.astro.inspiral_rangefunction renamed tosensemon_range[gwpy/gwpy!1293]
New Features#
ROOT I/O now uses
uprootas the backend [gwpy/gwpy!1263, #1309]pathlib.Pathobjects are now supported everywhere file names are passed around (hopefully) [gwpy/gwpy!1362, #1380]gwpy.signal.filter_design.notchnow supports anoutputkeyword [gwpy/gwpy!1347]gwpy-plot qtransformnow supports FFT options on the command-line [gwpy/gwpy!1330]new
--average-methodcommand-line option forgwpy-plot[gwpy/gwpy!1329]TimeSeries.rayleigh_spectrumnow supports awindowkeyword [gwpy/gwpy!1285]
API Changes#
passing a
channelname is now optional when reading files in thehdf5.snaxformat [gwpy/gwpy!1275]the default spectral averaging method is now ‘median’ (was ‘mean’) [gwpy/gwpy!1282]