Obspy Versions Save

ObsPy: A Python Toolbox for seismology/seismological observatories.

1.4.0

1 year ago

Changes:

  • obspy.core:
    • Minimum supported Python version is now 3.8 (see #3081, #3087)
    • Minimum supported dependency versions are now numpy 1.20, scipy 1.7 and matplotlib 3.3 (see #3081, #3087)
    • response: avoid reporting all unkown units (e.g. "RAD/S") to evalresp as displacement ("DIS") which with default value for "output" ("VEL") leads to evalresp adding a differentiation during response calculation. Instead report undefined unit, which makes evalresp use response as is and essentially ignoring "output" parameter (see #2945)
    • Improved expanded channel information in string representation of Station, e.g. when displaying station in IPython shell (see #3024)
    • limit length of list which records processing info (see #2882)
    • map plots: fix initial map setup, properly pass through user specified options, like "projection" etc (see #3191)
  • obspy.clients.fdsn:
    • update URL for NCEDC to https (see #3203)
    • add all valid parameters to get_stations_bulk, e.g. geographical constraints (see #3140)
    • do not use autodiscovery of file format in get_stations, unless "format" is set to something we do not recognize (see #3138)
    • fix a bug in routing client that made any request made error out when "debug=True" was set (see #3214)
    • fix raising FDSNTooManyRequestsException when server rejects request due to rate limiting, due to a bug instead a TypeError was raised (see #3219)
  • obspy.clients.seishub:
    • submodule removed completely, since it is outdated and not even test servers have been running for years (see #2994)
  • obspy.db:
    • submodule removed completely, since mostly being used in discontinued seishub server (see #2994)
  • obspy.imaging:
    • spectrogram: change the computation for default window length if not specified to give useful values for sampling rates much higher or lower than 100 Hz (see #3093)
    • spectrogram: better exception type and messages when input signal is too short (see #3093)
    • map plots: fix initial map setup, properly pass through user specified options, like "projection" etc (see #3191)
  • obspy.io.alsep:
    • new module for reading data from the Apollo missions stored in ALSEP format (see #3156)
  • obspy.io.nlloc:
    • avoid mangling channel/component code when writing nonlinloc phase file, just write full channel code unchanged into nonlinloc's "component" field (see #3223)
    • fix reading nonlinloc hypocenter files written by newer nonlinloc versions, data parsed into Arrivals was wrong (see #3223)
    • read geometrical station azimuth instead of ray takeoff azimuth from hypocenter. This is more robust (ray takeoff values sometimes not accurate at all) and also follows more the QuakeML documentation that states "Azimuth of station as seen from the epicenter" which implies a simple geometrical calculation (see #3224)
    • ignore ray takeoff dip if the stated quality for it is "0 - unreliable". our example data show that values can be blatantly wrong when quality is reported as "0" (see #3224)
    • write timing error as "0.0" if it is not set on a pick, as recommended by nonlinloc's author (see #2371, #3224)
  • obspy.io.nordic:
    • add support for writing multiple amplitudes for one pick (only new format) and writes some amplitude lines more compact (see #3075, also #2814)
    • add full support for reading and writing apparent velocity and backazimuth with new nordic format (see #3075)
    • fix comments on angle of incidence vs. takeoff angle (What is called angle of incidence in Seisan is the same as what is usually referred to as takeoff angle, see #3075)
    • add function to check whether phase is valid IASPEI phase in Seisan (#3075)
    • full support for writing high-accuracy origin line (see #3075)
  • obspy.io.sac:
    • expose a keep_sac_header flag to the write plugin, which allows users to write a "fresh" SAC header, instead of attempting to merge information from an old SAC header, if one exists. (see #2760)
    • fix writing SACPZ when a channel's sensor filed is unset (see #3187)
  • obspy.io.seiscomp:
    • update SeisComP 0.11 and 0.12 schema to potentially speed up sc3ml to qml event catalog conversions (see #3216 and SeisComP/common#74)
  • obspy.signal:
    • coincidence trigger: improve speed of template matching and less memory usage (see #3104)
    • Baer picker: fix a bug that could cause crashes on certain versions of libffi (see #3183)
    • polarization analysis: fix calculation of timestamps of the resulting values (see #3211)
  • obspy.taup:
    • add option "indicate_wave_type" to distinguish S waves in ray paths plot by using wiggly lines for shear waves (see #3047)
    • improved accuracy of ray paths by change of root-finding algorithm in SeismicPhase.refine_arrival (see #3064, #3096)
    • improved accuracy of travel time estimates by using theta function (see #3068)
    • add support for models without a core or inner core (see #1200, #1423, #2086, #2192, #2390, #3070)
    • add support for a wider range of diffracted phases, like SedPdiffKP (see #3085) and PKdiffP (see #3095)
    • allow rapid travel time plotting in plot_travel_times by using precalculated travel times (see #3092)
    • return pierce points for any depth (see #1742, #3072)
    • bug fix for rays which cannot turn due to low velocity at bottom of layer (see #3080)
    • add some checks for bad phases, so "ScScS" is not allowed (see #2774, #3082)
    • bug fix for sources within high slowness regions (see #2976, #3100)

1.3.1

1 year ago

Changes:

  • obspy.core:
    • Fix exclusion of magnitude 0 events in Catalog.filter (see #3105)
    • Trace.resample: Changed default for window to "hann" following a name change in scipy, "hanning" is not recognized anymore in newest scipy (see #3117)
    • Fix different data length for trim/slice methods (see #2608)
    • Add keep_empty_traces option to Stream.trim (see #2608)
    • Fix missing legend and plot artifacts in Inventory map plots at intersection of equator and prime meridian (see #3067)
    • Fix a bug in recaculation of overall instrument sensitivity (see #3099)
    • Fix colored IPython output on Windows (see #3148, #3171)
    • Add a warning in Trace.remove_response() docs, regarding using water level mechanism with instrument response non-flat with the requested output units (see #3172, #3136)
    • Fix reusing Catalog/Inventory map plots, i.e. doing multiple cartopy plots with these objects into the same axes (see #3018)
    • Fix Stream.rotate with multiple-station or multiple-event Streams (see #2623, 3155)
  • obspy.clients.fdsn:
    • Fix a bug in get_stations_bulk regarding parameter "includerestricted" (see #3158)
    • add URL mapping 'EIDA' for http://eida-federator.ethz.ch (see #3050)
    • Fix issue where "https://" URLs were not matched by the IRIS federator client, resulting in raspberry shake matches being excluded from results (see #3127)
    • Properly set HTTP Content-Type header in POST requests (see #3169)
  • obspy.clients.nrl:
    • deprecate online NRL client as it will stop working in Spring 2023 when old NRLv1 gets taken offline (see #3164)
    • enable reading from a downloaded full copy of the NRLv2 at http://ds.iris.edu/ds/nrl/ (see #3058)
    • Fix a bug in recaculation of overall instrument sensitivity after assembling response from separate sensor and datalogger response parts (see #3099)
  • obspy.imaging:
    • Scanner/obspy-scan: skip directories without read permission (see #3115)
  • obspy.io.gse2:
    • bulletin reading: correctly add Mag2 and amplitudes even if Mag1 is not present (see #2420)
  • obspy.io.mseed:
    • fix a bug in endtime calculation when writing fixed flags block information (see #3165)
  • obspy.io.seg2:
    • fix reading files that have a string header field with an empty value (see #3174, #3178)
  • obspy.io.stationxml:
    • fix a bug that resulted in losing decimation information of base type response stages (see #3159)
    • enable reading StationXML 1.2 and write new files with schema version 1.2 (see #3153)
  • obspy.io.wav:
    • fix writing of wav files with rescale=True and default width=None (see #3029)
  • obspy.signal:
    • trigger_onset(): fix a bug when trigger off threshold is higher than trigger on threshold and a trigger is active at the end of the characteristic function (see #2891, #3013)
  • obspy.signal.PPSD:
    • show warning on input of a trace that is too short to be processed (see #3073)
    • fix time comparisons in time restrictions when doing custom stacks, compare less/greater or equal instead of strict less/greater than (see #1477)
  • obspy.taup:
    • Fix cycling through colors in ray path plots, now also fixes cartesian plot version (see #2470, #2478, #3041)
    • Fix slowness layer splits to avoid "TauBranch depths not compatible with slowness sampling." errors. (see #3062, #2682, #1938)
    • Fix pierce points for 2kmps phases (see #2754)

1.3.0

2 years ago

Changes:

  • obspy.*
    • no more support for Python 2 (see #2577)
    • added python 3.9 and 3.10 tests for all platforms, minimal supported python version is 3.7 (#2925, #2489)
    • removed os.path calls with pathlib library calls (see #2751).
    • rewrote CI tests to make use of cache (see #2936)
    • removed individual logging configurations in Obspy, logging can be configured by the user, see documentation of Pythons logging module, only the FDSN mass downloader automatically configures logging as before, but this behavior can be turned off now. The loglevel keywords are therefore deprecated and have no effect anymore (see #2720)
    • refactored obspy-runtest to use pytest and modified several command line arguments, required to disable image comparisons (see #2489)
    • removed calls to deprecated NumPy functionality (see #2949, #2981)
    • cleaned the documentation, build process, and docstrings (see #2662, #2954)
    • refactored and modernized setup.py (see #2422)
  • scripts:
    • SDS report: try to be faster on slow filesystems (see #3009)
  • obspy.core:
    • speed up import of obspy core functions (see #2758)
    • read_inventory(): add "level" option to read files faster when less level of detail is needed. currently only implemented for StationXML reading (see #2759)
    • add option to suppress evalresp sensitivity mismatch warning when removing instrument response (see #2677)
    • round magnitudes in Catalog/Event string representation to one decimal (see #2742)
    • add support for pathlib.Path objects in read(), read_inventory() and read_events() functions (see #2743)
    • add a "DEF" option (default units) to Inventory.plot_response() and Trace.remove_response() (see #2806)
    • stream.select(): circumvent wildcard-matching when called with a trace-id without wildcards for quicker trace selection.
    • Inventory addition now consistently uses shallow copies (#2675, #2694)
    • removed obsolete wrapper around numpy.loadtxt causing import error with numpy 1.22 (see #2912, #2913)
    • fix iso8601 regex for issue #2868 to cope with day 360 properly
    • fix crash when resampling very short traces (see #2926)
    • response list stages: do not raise an exception if response calculation involves extrapolation outside of frequency range defined by the response list stage but rather only show a warning. raising an exception is the safe route but it also prevents valid calculations as it is up to the user to make sure that signal spectrum is properly suppressed in those frequency ranges outside of the valid response information (see #2988)
    • fix a bug while checking for valid URI syntax when setting identifiers on inventory type objects (see #2905)
  • obspy.clients.arclink:
    • submodule removed completely, since ArcLink was officially deprecated and deactivated on all big datacenters years ago (see #2994)
  • obspy.clients.fdsn:
    • introduce fine-grained FDSN client exceptions (see #2653, #2964)
    • support for "eventtype" parameter in get_events(), as specified in version 1.2 of the FDSN event web service (see #2780)
    • Hostnames with hyphens and long TLDs are no longer rejected as invalid FDSN server URLs (#2878)
    • add URL mapping for IRISPH5, IESDMC, GEOFON (alternative to GFZ) (see #2739, #2932)
    • update RESIF URL mapping to use http and add RESIFPH5 (see #2938)
  • obspy.clients.filesystem:
    • add get_waveforms_bulk() method to SDS client (see #2616, #2626)
    • SDS client get_latency(): make one internal check optional which can be a massive speedup on slow filesystems (see #3009)
  • obspy.clients.seedlink:
    • basic client: properly terminate after finished get_info() request (see #2996)
  • obspy.imaging:
    • fix section plot in case of a single trace only (see #2764)
    • removed basemap, now only cartopy is supported for maps (see #2961)
    • fix day plot when passed a small interval (see #2967)
  • obspy.clients.filesystem.tsindex:
    • improvements to leap second file setup and other small fixes (see #2776)
  • obspy.clients.seedlink:
    • Fix a bug in basic client when printing debug output (see #2734)
  • obspy.clients.seishub:
    • added deprecation message
  • obspy.db:
    • added deprecation message
    • removed from default test suite
  • obspy.io
    • add support to resolve the SEED id of picks for nlloc hyp files and nordic files, refactor the same functionality for SeismicHandler evt and HypoDD pha files. Some parameter names therefore changed in the latter, but former parameter names are still supported (see #2251)
  • obspy.io.css:
    • open CSS waveforms even if gzip-compressed (see #2736)
  • obspy.io.gse2:
    • When reading GSE2 bulletins, station magnitudes now include waveform IDs and have associated station magnitude contributions (see #2718)
  • obspy.io.hypodd
    • add PHA write support (see #2687)
    • add read support for horizontal and vertical origin uncertainty (see #2687)
  • obspy.io.kinemetrics:
    • adds the apply_calib argument to the read_evt method to allow obtaining the raw data bits stored in the evt file (see #2582), note this changes the default (wrong!) behaviour, by default the data returned will be the NOT corrected ones. When passing apply_calib=True, the calibration factor will be used.
  • obspy.io.nordic:
    • add read and write support for New Nordic format (see #2814)
    • fix bug where negative magnitudes were not read properly
    • fix bug where empty hours / minutes / seconds were not read as zero
    • fix bug where lat/lon-errors were read as lon/lat
    • fix bug where origin-error was written with RMS rather than time_error
    • for reading picks in Old Nordic format, set network code to None (was 'NA' previously)
    • stop writing waveform-file link to a DUMMY-file by default
    • add support for I/O of apparent velocity / horizontal slowness
    • add support for writing of multiple origins
    • add event-type mapping between Nordic and Obspy/Quakeml (do not fully match)
    • read pick-weight as pick.extra.nordic_pick_weight (was arrival.time_weight) and read finalweight into arrival.time_weight (or backazmiuth_weight) instead.
  • obspy.io.reftek:
    • enable reading data with floating point sampling rates like low sampling rate state-of-health channels (see #2678)
    • fix reading data in '16' and '32' encodings, when packets do not use the fixed maximum amount of available number of samples per data packet (see #2678)
    • properly take into account native system byteorder, should fix reading rt130 data on big endian systems (see #2678)
  • obspy.io.seiscomp:
    • Add support for SC3ML 0.11 and 0.12, dropped support for SC3ML < 0.6 (see #2284).
    • Add support for custom tags (see #2284).
  • obspy.io.sh:
    • fix appending traces to existing Q file (see #2870)
  • obspy.io.xseed:
    • fix a bug reading SEED blockettes 48 and 58 which was likely never encountered (see #2668)
    • Properly read a given value of 0.0 in station elevation and not replace it with bogus value (see #2763)
  • obspy.signal.array_analysis
    • fixed an issue in array_processing function returning wrong times for matplotlib versions >= 3.3 due to the epoch change in matplotlib (see #2723)
  • obspy.signal.cross_correlation:
    • Remove deprecated xcorr function, remove deprecated domain keyword argument in correlate function (see #1979)
  • obspy.signal.spectral_estimation.PPSD:
    • Added special handling option for infrasound data and global infrasound noise models for plotting (see #2740)
    • Replaced use of deprecated Matplotlib functionality (see #2951)
  • obspy.signal.trigger:
    • Improved clarity and speed of several STA/LTA triggers methods, namely classic_sta_lta_py, z_detector, and recursive_sta_lta_py (see #2892)
    • Added simple AIC method by Maeda (1985)

1.2.2

3 years ago

Changes:

  • obspy.core:
    • Fix wrong values in Stats object after deepcopy or pickle of Stats object for edge cases (see #2601)
  • obspy.clients.fdsn:
    • EIDA routing client: fix an issue that leaded to a request of all EIDA data when requesting an invalid, out-of-epochs time window for a valid station (see #2611)
    • update RASPISHAKE URL mapping to use https
    • fix a bug of not handling HTTPException in mass_downloader (see #2606)
    • use the client's set timeout in service discovery, too (see #2656)
    • add URL mapping for FDSNWS at UIB-NORSAR (see #2659)
  • obspy.clients.filesystem:
    • sds: continue get_all_stations() even if encountering an invalid channel code (see #2636)
  • obspy.clients.neic:
    • Make client socket blocking (see #2617)
  • obspy.io.hypodd:
    • Allow 60.0 seconds in the second field of origin times, allow NaN in the magnitude field for pha format (see #2627)
  • obspy.io.nordic:
    • Fixed a bug raising an exception when reading a nordic file with a non positive-definite covariance matrix (see #2593)
  • obspy.io.seiscomp:
    • Fixed an issue where a response has zero zeros or poles (see #2633)

1.2.1

4 years ago

ObsPy 1.2.1 (doi: 10.5281/zenodo.3706479)

Changes:

  • fix an installation issue with pip and setuptools version 46 (see #2578)
  • fix response plots when providing axes=... with a numpy array of Axes instances (see #2579)

1.2.0

4 years ago

ObsPy 1.2.0 (doi: 10.5281/zenodo.3674646)

Work on this release was in parts and among others supported by the following institutions/companies and grants (in alphabetical order):

  • Earthquake Commision of New Zealand (EQC), grant 18/753
  • École et Observatoire des Sciences de la Terre - Université de Strasbourg
  • ETH Zürich
  • Friedrich-Schiller-Universität Jena
  • Geoscience Australia
  • Incorporated Research Institutions for Seismology (IRIS), NSF (SAGE) award :: EAR-1851048
  • Institut de Physique du Globe de Strasbourg
  • Institut de Physique du Globe de Paris
  • Institutions for Seismology (IRIS) through the PASSCAL Instrument Center at New Mexico Tech. The facilities of the IRIS Consortium are supported by the National Science Foundation under Cooperative Agreement EAR-1261681 and the DOE National Nuclear Security Administration.
  • Istituto Nazionale di Geofisica e Vulcanologia, Osservatorio Etneo (Italy), Allegato B2 DPC-INGV 2012-2021 Task 10
  • Ludwig-Maximilians-Universität München
  • National Institute for Occupational Safety and Health
  • Royal Netherlands Meteorological Institute (KNMI)
  • School of Geography, Environment and Earth Sciences, Victoria University of Wellington
  • The European Union’s Horizon 2020 research and innovation programme under the ChEESE project, grant agreement No. 823844
  • The Royal Observatory of Belgium
  • U.S. Geological Survey

Changes:

  • obspy.core:
    • Inventory objects have been adapted to StationXML 1.1 for details on changes see #2510 and https://github.com/FDSN/StationXML/blob/master/Changes.md
    • Fixed import of custom plugins (see #2423)
    • Fixed "==" comparison for Stream and Trace which was very slow in case of traces with >1e6 samples (see #2377)
    • Added almost_equal method for Stream and Trace classes (see #2286).
    • Casting FDSN identifiers to strings upon setting in the stats dictionary (see #1997).
    • UTCDateTime objects will now always evaluate equal if their string representations are equal (see #2049).
    • UTCDateTime objects now issue depreciation warnings when setting any attributes outside of init, or comparing UTCDateTime objects with different precisions (see #2077).
    • UTCDateTime objects can now accept hour, minute, second, and microsecond values greater than their normal limits by setting the strict keyword argument to False (see #2232).
    • Fixed UTCDateTime(..., julday=366) for non-leap years. This was returning January 1st of the next year in case of non-leap years being used. Now it properly raises an out-of-bounds ValueError (see #2369)
    • When reading StationXML/SC3ML, make sure to properly read empty string fields as empty strings instead of "None" (see #2519 and #2527)
    • Better ISO8601 detection for UTCDateTime objects and UTCDateTime(..., iso8601=False) now completely disables ISO8601 handling (see #2447)
    • Added replace method to UTCDateTime class (see #2077).
    • Added remove method to Inventory class (see #2088).
    • Added id property to WaveformStreamID (see #2131).
    • Added str and repr_pretty method for Comment class (see #2115)
    • Added eq to QuantityError so empty instances equal None (see #2185).
    • Reworked the event scoped resource identifiers for the event classes hopefully fixing all edge-cases (see #2091).
    • Added a hook to allow users to customize finding objects for resource_ids which are not found via the normal means (see #2279).
    • Calling Stream.write(...) on an empty stream will now raise an ObsPyException consistently across all I/O plugins (see #2201)
    • Stream.get_gaps() will now properly report gaps within Traces that have masked arrays (i.e. Traces that have been merged without a fill value, see #2299 and #2300).
    • Added copy method to Inventory class (see #2322).
    • The Response.recalculate_overall_sensitivity() method now accepts integers (see #2338, #2343).
    • Added wildcard and url support to read_inventory (see #2326).
    • Modified stream.get_gaps() to deal with overlaps correctly (see #1403)
    • Added option "label_epoch_dates" to Inventory/Network.plot_response() to optionally add channel epoch start/end dates to legend labels (see #2309)
    • Deprecated the convert_id_to_quakeml_uri, regenerate_uuid, and get_quakeml_uri methods of the ResourceIdentifier class (see #2303).
    • Added get_quakeml_uri_str and get_quakeml_id methods to the ResourceIdentifier class (see #2303).
    • New method to create response objects directly from poles and zeros (see #1962).
    • Added Stream.stack method (see #2440).
    • Added a component field to the Stats object which allows to get and set the last character of the SEED channel (see #2484).
    • Fixed a bug in Stream.plot(type='section', reftime=..., ...) that caused wrong relative start times of traces relative to given reftime (see #2493)
    • Fixed a Windows-specific path case issue in a helper function that returns a list of untracked files in the git repository (see #2296)
    • Fix a bug that was causing an exception being raised in Response.plot() because a float was being passed down to numpy.linspace as length of array (see #2533)
    • Geographic select of inventory/network/station (see #2515)
    • Select traces in Stream based on an Inventory (see #2531)
  • obspy.clients.fdsn:
    • Add new _discover_services boolean flag to the Client, which allows the Client to skip the initial services query at instantiation. This can reduce the load on service providers, but skips checks against unsupported query parameters.
    • Adding more location codes to the default priority list in the mass downloader (see #2155, #2159).
    • The mass downloader now raises a warning if all channels from a station have been deselected due to the default location priorities setting. This is a pure usability improvement as it has been confusing users (see #2159).
    • Make sure that streams fetched via FDSN are properly trimmed to user requested times if data center serves additional data around the start/end (see #1887, #2298)
    • Fix a problem that could spam subprocesses that were not closed in routed clients (see #2342 and #2344)
    • Make it possible to use signed EIDA tokens and also skip token validation completely (see #2297)
    • Adding a mapping for RASPISHAKE
  • obspy.clients.filesystem.tsindex:
    • Add new Client & Indexer modules based on IRIS time series index (see #2206)
  • obspy.clients.iris:
    • Results of distaz method are now returned as native floats (see #2499)
  • obspy.clients.neic:
    • Properly use specified timeout value (see #2450)
  • obspy.clients.seedlink:
    • Add method "get_info()" to fetch information on what networks/stations/locations/channels are served by the seedlink server (see #2405)
    • "get_waveforms()" can now be used with '*' and '?' wildcards in any part of requested SEED ID, i.e. network, station, location and channel (see #2405)
  • obspy.clients.seishub:
    • Properly handle fetching poles and zeros in presence of multiple metadata files for a given station (see #2411)
  • obspy.geodetics:
    • New utility function inside_geobounds() to check whether an object is inside a geographic bound (see #2515)
  • obspy.imaging:
    • obspy-scan can now be used with wildcarded SEED IDs when specifying what to plot after scanning data (see #2227)
    • Fix a problem in Scanner when loading npz on Python3 that was written on Python2 (see #2413)
    • Fix an issue that could make small landmasses not get plotted in basemap plots (see #2471, #2477)
    • Fixed a bug in Stream.plot(type='section', reftime=..., ...) that caused wrong relative start times of traces relative to given reftime (see #2493)
  • obspy.io:
    • Added read support for receiver gather format v. 1.6 (see #2070)
    • Added read support for FOCMEC 'out' and 'lst' files (see #2156)
    • Added read support for HypoDD 'pha' files (see #2378)
  • obspy.io.arclink:
    • Accommodate change in SeisComP3 publicID delimiter from '#' to '/' in ArclinkXML (see #2552)
  • obspy.io.dmx:
    • Add read support for INGV's DMX format (see #2452)
  • obspy.io.gcf:
    • Fixes Python 3.8 compatibility of GCF reader. (see #2505)
  • obspy.io.mseed:
    • Fix a bug resulting in an infinite loop when trying to read a FullSEED file without any data records (see #2534 and #2535)
    • Add ability to write int64 data to mseed if it can safely be downcast to int32 data, otherwise raises ObsPyMSEEDError. (see #2356)
    • The recordanalyzer can now detect calibration blockettes 300, 310, and 320 (see #2370).
    • Can now write zero sampling-rate traces. (see #2488, 2509)
  • obspy.io.nordic:
    • Add ability to read and write focal mechanisms and moment tensor information. (see #1924)
    • Add explicit warnings regarding unsupported sections of Nordic files.
    • Fix mapping of magnitude-types between MS to S and Ms to s.
    • Output preferred origin when writing to Nordic format instead of using the first origin (see #2195)
    • Include high-accuracy phase-pick reading and writing - high-accuracy is now the default phase-writing format, a boolean flag high_accuracy has been added to turn this off. (see #2351 and #2348)
    • Allow long-phase names (both reading and writing) - longer than 4 char. (see #2351)
    • Include AIN as takeoff-angle when reading and writing nordic files (see #2404).
    • Add error ellipses and read high-accuracy hypocenter lines (see #2451)
    • Fix the incorrect handling of events missing pick evaluation information (see #2520)
  • obspy.io.reftek:
    • Implement reading reftek encodings '16' and '32' (uncompressed data, 16/32bit integers, see #2058 and #2059)
  • obspy.io.rg16:
    • Implement module to read waveforms and headers from fcnt format (see #2265).
    • Fix reading when start+endtime are inside one data packet (see #2485).
  • obspy.io.sac:
    • Fix bug writing inventory with SOH channels to SACPZ (see #2200).
    • Blank-pad character header variables, as opposed to NUL-padding them, to comply with SAC behavior (see #2543).
  • obspy.io.segy:
    • Raise nicer error messages when header packing fails (see #2194, #2196).
    • Show nice error message when trying to write a trace with too many samples in it (see #2358, #1393)
  • obspy.io.seg2:
    • Handle data format code 3 trace data (#2022, #2385).
    • Improve parsing of free-form entries (#2385).
    • Fix non-native endian data loading (#2385).
  • obspy.io.seiscomp:
    • Adding support for SC3ML 0.10 (see #2024).
    • Update xsl to allow conversion of amplitude picks not associated with origins (see #2273).
    • Very large performance improvement reading large sc3ml inventory files by pre-indexing sensors, dataloggers and responses and reducing lxml calls (see #2296).
    • When reading StationXML/SC3ML, make sure to properly read empty string fields as empty strings instead of "None" (see #2519 and #2527)
  • obspy.io.sh:
    • Add read support for SeismicHandler EVT event files (see #2109)
  • obspy.io.shapefile:
    • Add possibility to add custom database columns when writing catalog or inventory objects to shapefile (see #2012 and #2305)
  • obspy.io.stationxml:
    • When reading StationXML/SC3ML, make sure to properly read empty string fields as empty strings instead of "None" (see #2519 and #2527)
    • Inventory objects have been adapted to StationXML 1.1 for details on changes see #2510 and https://github.com/FDSN/StationXML/blob/master/Changes.md
  • obspy.io.quakeml:
    • Allow writing invalid ids but raise a warning (see #2104, #2090, #2093, #1872).
    • Skip invalid enumeration values during reading but raise a warning. (see #2106, #2098, #2095)
    • Catalogs with empty event description objects can be round-tripped (see #2339, #2340).
    • Correctly handle QuakeML native namespaces (if they are not matching the document root's namespace) as custom namespaces and parse them into .extra (see #2466)
  • obspy.io.xseed:
    • Ability to parse SEED files with extra newlines between blockettes (see #2383)
  • obspy.signal.cross_correlation:
    • Add new correlate_template() function with 'full' normalization option, required for correlations in template-matching (see #2035 and #2042).
    • 'domain' parameter in correlate function is deprecated in favour of new 'method' parameter to be consistent with recent SciPy versions (see #2042).
    • Add correlate_stream_template() and correlation_detector() functions to detect events based on template matching (see #2315)
  • obspy.signal.PPSD:
    • Changed numpy-based serialization as to not require pickling (see #2424).
    • Fixed exact trace cutting for PSD segments (see #2040).
    • Timestamp representations internally and in npz I/O were changed to use integer nanosecond POSIX timestamps to avoid any potential floating point inaccuracies and since this is also what UTCDateTime is based on nowadays (see #2045).
    • Fixed the check for new PSD slices whether they should be added or whether they would add unwanted duplicated data (see #2229).
    • Fix period_lim option when xaxis_frequency=True (see #2246).
    • Added allow_pickle parameter to PPSD.add_npz and PPSD.load_npz and set its default to False (see #2457).
    • Added representation of earthquake models from Clinton & Heaton (2002) in 'plot()' method using option 'show_earthquakes' (see #2455).
  • obspy.signal.polarization:
    • Fix an issue with covariance matrix in vidale algorithm and make adaptive windowing opt-out (see #2565)
    • Fix an issue in selecting Z/N/E traces from given stream (see #2365)
  • obspy.signal.trigger:
    • Fix a bug in AR picker (see #2157)
    • Option to return Baer-Kradolfer characteristic function from pk_mbaer function added (see #2341)
  • obspy.taup:
    • Fix cycling through colors in ray path plots (see #2470, #2478)
    • Fix a floating point issue on IBM machines (see #2559, #2560)

1.1.1

5 years ago

This is the first and only bug fix release in the 1.1.x series.

Full changelog:

1.1.1: (doi: 10.5281/zenodo.1040770)

  • General:
    • Tests pass with numpy 1.14 (see #2044).
    • Map plots now also work with matplotlib >= 2.2 (see #2089).
  • obspy.core:
    • UTCDateTime now raises a meaningful exceptions when passing invalid or out-of-bounds 'julday' during initialization (see #1988)
    • Fix pickling of traces with a sampling rate of 0 (see #1990)
    • read_inventory() used with non-existing file path (e.g. typo in filename) now shows a proper "No such file or directory" error message (see #2062)
    • Fix Trace.times(type='matplotlib') being slow (see #2112)
    • read_events() and read_inventory() now trial most common plugins first (QuakeML/StationXML, ...) in case of automatic file format detection (i.e. when file type was not explicitly specified, see #2113)
    • Event instances with Origin instances that have do not have defined latitude/longitude attributes will no longer raise a TypeError when creating a string representation (see #2119 and #2127).
    • Fix Stream.get_gaps() when a trace is completely overlapping another trace (see #2218).
    • Fix Exception when comparing ComparingObjects (see #2220).
    • Fix UTCDateTime.strftime() when year is <1900 on Python 2 (see #2167)
    • Inventory objects are more convenient to create now. Network, station, and channel codes can now be optional. Additionally the source parameter of inventories must no longer be specified at init time (see #2307, #2314).
  • obspy.clients.arclink:
    • Raise a warning at import time that the ArcLink protocol will be deprecated soon (see #1987).
  • obspy.clients.fdsn:
    • Mass downloader: Priority lists are now correctly overwritten if channel and/or location are set (see #1810, #2031, #2047).
    • A few fixes and stability improvements for the mass downloader (see #2081).
    • Fixed routing startup error when running under certain locales (see #2147)
    • Update the IPGP mapping (see #2268).
    • Adding a mapping for the KNMI (see #2270) services.
  • obspy.clients.nrl:
    • Set input units of overall sensitivity to input units of first stage in NRL.get_response() (see #2248)
  • obspy.geodetics:
    • Fix the vincenty inverse calculation for equatorial lines (see #2282).
  • obspy.imaging:
    • Normalize moment tensors prior to plotting in the mopad wrapper to stabilize the algorithm (see #2114, #2125).
    • fix some map plotting issues with cartopy and local projection (see #2193, #2204)
  • obspy.io.ascii:
    • Fixes an issue with the time representation (see #2165, #2179).
  • obspy.io.cnv:
    • Bugfix when phase_mapping is passed as argument when writing a Catalog object to CNV (see #2001)
  • obspy.io.css:
    • Fix automatic filetype detection (see #2160 and #2162)
  • obspy.io.gcf:
    • Fix reading stream ID for station/channel code in header (see #2289, #2311)
    • Fix bitmask in getting compression code (see #2290, #2310)
  • obspy.io.mseed:
    • Ability to read files that have embedded chunks of non SEED data. (see #1981, #2057).
    • Fix util.get_start_and_end_time returning sample rate = 0 when sample rate = 1 (see #2069)
    • Avoid showing invalid warnings when guessing endian during parsing timestamps (see #1988)
    • util.get_record_information() now works correctly for negative sampling rate factors and multipliers (see #2030, #2191).
  • obspy.io.nordic
    • Bug-fix for amplitudes without magnitude_hint (see #2021)
    • Bug-fix for wavefiles with full path stripping (see #2021)
    • Bug-fix for longitudes between -100 and -180 (see #2197)
  • obspy.io.reftek:
    • Fix problems reading some Reftek 130 files, presumably due to floating point accuracy issues in comparing timestamps. Internal representation of time stamps is changed to integer nanosecond POSIX timestamp (see #2036, #2038, #2105)
    • Fix a bug that prevents reading files that have no data in first channel (see #2101)
  • obspy.io.sac:
    • Allow passing on the byteorder flag from the top-level obspy.read() function (see #2285, #2292).
  • obspy.io.seiscomp:
    • Fix inventory read when maxClockDrift is unset in SC3ML (see #1993)
    • Fix the reading of FIR coefficients when multiple whitespaces in SC3ML (see #2259)
    • Fix the reading of the poles and zeros when multiple whitespaces in SC3ML (see #2260).
    • Fix reading files with zero sampling rates (see #2294 and #2293)
    • Fix divide by zero error when parsing sc3ml files of zero sampling rage (see #2294).
  • obspy.io.stationxml
    • Allow writing of dates before 1900 also on Python 2 (see #2013, #2015).
    • Write the UTC time zone specifier to all times (see #2015).
    • Units of first response stage as well as unit response stages are now determined with some heuristics (see #2250, #2318).
  • obspy.io.xseed:
    • Third condition to split blockettes when reading RESP files. Now more forgiving for slightly different files (see #2170, #2189)
  • obspy.signal:
    • Allow singular COUNT units in evalresp (see #2003, #2011).
    • Fix an evalresp issue in case of an analog PAZ stage zero denominator (see #2171 and #2190)
    • PPSD: for safety reasons, raise an ObsPyException if trying to read a PPSD npz file that was written with a newer version of the npz representation than is used by current ObsPy version (see #2051)
    • The ar_pick() trigger function now raises an error if the three data arrays don't have the same length (see #1801, #2148).
    • fix a precision issue in AR picker in case of low amplitude input (see #2252 and #2253)
  • obspy.taup:
    • Fallback to linear slowness interpolation for very small and shallow layers (see #2126, #2129).
    • Fix bug preventing constant-velocity models with discontinuities at every layer boundary from being built (see #2264).
    • More robust resize method so TauPy now works properly on Python 3.7 (see #2280, #2319).

1.1.0

6 years ago

This is a major release with a lot of new features, bug fixes, and general improvements and we strongly recommend all users to update. Follow this link to learn more:

What's New in ObsPy 1.1

Full Changelog

1.1.0: (doi: 10.5281/zenodo.165135)
 - General:
   * Read support for Guralp Compressed Format (GCF) waveform data,
     obspy.io.gcf (see #1449)
   * Read support for Reftek 130 (rt130) waveform data,
     obspy.io.reftek (see #1433)
   * Add Nordic format (s-file) read/write (see #1517)
   * Read and write support for events in the SCARDEC catlogue format
     (see #1391).
   * Read support for IASPEI ISF ISM 1.0 Bulletin event data,
     (see #1946)
   * Write support for AH (Ad Hoc version 1) format (see #1754)
   * Client to access the Nominal Response Library (NRL) (see #1185).
   * `obspy.read_inventory()` can now read dataless SEED and RESP files
     (see #1185).
   * change version number scheme for scenarios when no official version number
     can be determined (see #1889 and #1916)
   * Support for the IRIS Federator and EIDAWS FDSNWS web routing services
     (see #1779 and #1919).
 - obspy.core:
   * UTCDateTime is now based on nanoseconds (long) instead of a unix
     timestamp in microseconds (float) - resulting in higher precision and
     support for years 1-9999 (see #1325)
   * Ensure that Trace.data is always C-contiguous in memory (see #1732)
   * Event/ResourceIdentifier is now object aware, meaning even if two
     objects share a resource_id the distinct objects will be returned with
     the get_referred_object method provided both are still in scope. If one
     of the objects gets garbage collected, however, a warning will be issued
     and the behavior will be the same as before (see #1644).
   * Better error message when attempting to write invalid QuakeML resource
     ids (see #1699).
   * Stream/Trace.write() can now autodetect file format from file extension
     (see #1321).
   * New convenience property `.matplotlib_date` for `UTCDateTime` objects to
     get matplotlib datetime float representation (which can be used in
     time-based matplotlib axes, e.g. by Stream.plot(); see #1339).
   * Trace.times() has new options `type` and `reftime` to support fetching an
     array of sampletimes in various different timing varieties ("relative":
     the old default, float relative to trace starttime or `reftime` in
     seconds; "utcdatetime": absolute times as UTCDateTime objects;
     "timestamp": array of float POSIX timestamps, compare
     `UTCDateTime.timestamp`; "matplotlib": array of float matplotlib dates,
     useful for plotting on matplotlib time axes; see #1307)
   * A trace's stats.network/station/location/channel can now also be set in
     one line using a SEED ID string (e.g. `trace.id = "GR.FUR..HHZ"`,
     see #1439).
   * Instrument correction for response list stages originating from inventory
     objects (see #1514).
   * `Stream.rotate(...)` can now also be used to rotate unaligned channels to
     Z-N-E, given an Inventory (see #1310)
   * Non finite floats (NaN, inf, -inf) can now no longer be set for all
     event objects (see #1597).
   * Instrument responses can now also be calculated for a given list of
     frequencies (see #1598).
   * Order of extra tags for event type classes serialized to QuakeML can now
     be controlled by using an OrderedDict (see #1617)
   * Bode plots can now optionally plot the phase in degrees (see #1763).
   * `Stream.select()` now also works on the component level if channels only
     have one letter (see #1847).
   * Now strips all invalid characters from the temporary filenames used for
     downloading data using the `read_X()` methods (see #1958).
 - obspy.clients.earthworm:
   * Much faster trace unpacking (see #1762).
 - obspy.clients.fdsn:
   * empty SEED codes (e.g. ``network=''``) will now be properly sent to the
     server as options and not omitted, which led to wildcard matching (for
     details see #1578)
   * The mass downloader now has `exclude_networks` and `exclude_stations`
     arguments to not download certain pieces of data. (see #1305)
   * The mass downloader can now download stations that are part of a given
     inventory object.
   * The mass downloader now also works with restricted data. (See #1350)
   * No data (HTTP 204) responses now raise `FDSNNoDataException` rather than
     the more general `FDSNException`.
   * Fixing cross implementation of bulk waveform and station requests (see
     #1685).
   * Adding mappings for the TEXNET (see #1852) and the ICGC (see #1902)
     services.
   * Support for the non-standard EIDA token authentication (see #1928).
 - obspy.imaging:
   * The functionality behind the `obspy-scan` command line script has been
     refactored into a `Scanner` class so that it can be reused in custom
     workflows. (see #1444)
 - obspy.imaging.cm:
   * new colormap: viridis_white. This is a modification of viridis that
     goes to white instead of yellow but remains perceptually uniform. It
     is especially useful for printing when an image should merge with the
     white background.
 - obspy.imaging.waveform:
   * Support for filling the wiggles when plotting sections (horizontal and
     vertical, see #1445).
 - obspy.io.arclink:
    * Read support for Arclink Inventory XML (see #1539)
    * default for `route` parameter in metadata requests is changed to `False`
      (see #1756)
 - obspy.io.ascii:
    * Custom formatting of sample values when writing SLIST and TSPAIR.
 - obspy.io.datamark:
    * Renamed without deprectation to obspy.io.win to match its original name.
      Datamark is a datalogger, saving the WIN format.
 - obspy.io.gse2:
    * Read support for GSE2.0 bulletin (see #1528)
 - obspy.io.nlloc:
    * Also parse author information and COMMENT line (see #1484)
    * Fix reading hypocenter files created by NonLinLoc versions of the 6.0.x
      beta branch (see #1760 and #1783)
 - obspy.io.quakeml:
    * Read and write support for nested custom tags (see #1463)
    * Fix some minor bugs that could lead to empty stub elements, e.g. like
      empty MomentTensor when reading and later writing again a QuakeML file
      with a FocalMechanism but no MomentTensor, potentially resulting in
      QuakeML files that breach the QuakeML schema (see #1896)
 - obspy.io.seiscomp:
    * Read and write support for SC3ML event (see #1638 and #1848)
    * Fix bug where files with arbitrary publicIDs and files with missing
      depth, latitude, longitude, or elevation tags could not be read
      (see #1817)
 - obspy.io.stationtxt:
    * Write support for stationtxt format (see #1466)
 - obspy.io.stationxml:
    * Read and write support for custom tags (see #1024)
    * No longer add the (unused) time zone field to StationXML datetimes to
      follow the example of big data centers. (see #1572)
    * Level of detail can be specified during inventory write (see #1830)
      using the level keyword (one of: network, station, channel, response).
    * Skip empty and incomplete channels during reading (see #1839, #1840).
 - obspy.io.segy:
    * Fixing an issue when comparing two still packed SEG-Y trace headers
      (see #1735).
    * Iterative reading of large SEG-Y and SU files with
      `obspy.io.segy.segy.iread_segy` and `obspy.io.segy.segy.iread_su`.
      (see #1400).
    * Write correct revision number (see #1737).
    * Textual headers will now always contain the file revision number and the
      end header mark if nothing else exists at these positions (see #1738).
    * The SEG-Y format detection now also checks the format version number
      (see #1781).
    * Enable reading SEG-Y files that have day of year 0 in trace header
      (see #1722).
    * Write textual file headers also if given as a text string
      (see #1811, #1813).
 - obspy.io.css:
   * Read support for NNSA KB Core format waveform data. (see #1332)
 - obspy.io.mseed:
   * New generic get_flags() utility function able to retrieve statistics
     about all fixed header flags and the timing quality. This makes the
     get_timing_and_data_quality() function obsolete which is thus
     deprecated and will be removed with the next release. The get_flags()
     function is also much faster. (see #1141)
   * Always hook up the libmseed logging to its Python counterpart to avoid
     some rare segfaults. (see #1658)
   * Update to libmseed v2.19.5 (see #1703, #1780, #1939).
   * Correctly read MiniSEED files with a data offset of 48 bytes (see #1540).
   * InternalMSEEDReadingError now called InternalMSEEDError and
     InternalMSEEDReadingWarning now called InternalMSEEDWarning as both
     can now also be raised in non-reading contexts (see #1658).
   * Should no-longer segfault with arbitrarily truncated files (see #1728).
   * Will now raise an exception when attempting to directly read mini-SEED
     files larger than 2048 MiB (#1746).
   * `.stats.mseed` attributes are no longer per-file but per-trace where
     applicable (see #1782).
   * `get_record_information()` - Don't fail if the word order is invalid.
 - obspy.io.nlloc:
   * Set preferred origin of event (see #1570)
 - obspy.io.nordic:
   * Add Nordic format (s-file) read/write (see #1517)
 - obspy.io.win:
   * see obspy.io.datamark.
 - obspy.io.xseed:
   * Added azimuth and dip to the get_coordinates() function. (see #1315)
   * Fixing some issues with the get_resp() output on Python 3 (see #1748).
   * Can now also parse RESP files (see #1185).
   * Can transform responses in the Parser object to ObsPy Inventory objects
     (see #1185).
 - obspy.scripts:
   * obspy-scan command line script now also plots and prints overlaps
     alongside gaps (see #1366)
   * obspy-plot now has option to disable min/max plot (see #1583)
 - obspy.signal:
   * fixed a bug in calibration.rel_calib_stack (resulting amplitude response
     had wrong scaling if using non-default "overlap_fraction", see #1821)
   * fixed a bug in coincidence_trigger() with event templates. when a template
     with mismatching SEED ID was encountered all following (potentially valid)
     templates were skipped as well (see #1850)
   * New obspy.signal.quality_control module to compute quality metrics from
     MiniSEED files. (see #1141)
   * New correlate function for calculating the cross-correlation function
     (new implementation based on Scipy).
     To calculate the shift of the maximum of the cross correlation use
     xcorr_max. The old xcorr function is deprecated but currently still
     exists (see #1585).
   * New obspy.signal.regression module to compute linear regressions, with or
     without weights, with or without allowing for an intercept. (see #1716,
     #1747)
   * add new plotting capabilities to PPSD (temporal variations per frequency
     and spectrogram-like plot) and also make underlying processed PSDs
     available via `PPSD.psd_values` property (see #1327)
   * Fixed bug in `rotate2zne()` for non-orthogonal configurations
     (see #1913, #1927).
   * Fixed build warnings in evalresp, partially backported from evalresp
     4.0.6 (see #1939).
 - obspy.taup:
   * Add obspy.taup.taup_geo.calc_dist_azi, a function to return the distance,
     azimuth and backazimuth for a source - receiver pair. (see #1538)
   * Fixing calculations through very small regional models. (see #1761)
   * Updated ray path plot method, added travel time plot method, and wrapper
     functions for both ray path and travel time plotting. (see #1501, #1877)

1.0.3

7 years ago

This is the third (and planned to be last) bug fix release in the 1.0.x series.

Full changelog:

1.0.3: (doi: 10.5281/zenodo.165134)
 - obspy.core:
   * properly pass through kwargs specified for Trace.plot() down to the
     low-level plotting routines (e.g. events were not shown properly in
     dayplot of a trace, see #1566)
   * properly pass through kwargs from Stream.detrend() to Trace.detrend()
     (see #1607)
   * Correctly splitting masked arrays in Trace objects for a couple of corner
     cases (see #1650, #1653).
 - obspy.core.event.source:
   * Fix `farfield` if input `points` is a 2D array. (see #1499, #1553)
 - obspy.clients.earthworm:
   * Better end of stream detection. (see #1605)
   * More efficient unpacking of server response. (see #1680)
 - obspy.clients.neic:
   * Better end of stream detection. (see #1563)
 - obspy.clients.seedlink:
   * Better end of stream detection. (see #1605)
 - obspy.clients.seishub:
   * Fix wrong kwargs `first_pick` and `last_pick` in
     `Client.event.get_list()`. (see #1661)
 - obspy.io.mseed:
   * ObsPy can now also read (Mini)SEED files with noise records. (see #1495)
   * ObsPy can now read records with a data-offset of zero. (see #1509, #1525)
   * ObsPy can now read MiniSEED files with micro-second wrap arounds.
     (see #1531)
   * ObsPy can now read MiniSEED files with no blockette 1000. (see #1544)
   * ObsPy now always writes Blockette 100 if sampling rate accuracy is
     otherwise lost. (see #1550)
   * obspy.io.mseed.util.set_flags_in_fixed_header() now works with Python 3
     and also for files with Blockette 100 (see #1648).
 - obspy.io.quakeml:
   * write StationMagnitude.residual even when it is zero (see #1625)
   * read & write Event.region
 - obspy.io.sac:
   * `SACTrace.lpspol` and `lcalda` are `True` and `False` by default, when
      created via `SACTrace.from_obspy_trace` with a `Trace` that has no SAC
      inheritance. (see #1507)
   * Reference time not written to SAC file when made from scratch
     (see #1575)
 - obspy.io.sh:
   * Fix writing of long headers for python3
   * Whitespace in header fields is not ignored anymore (see #1552)
 - obspy.io.stationxml:
   * Datetime fields are written with microseconds to StationXML if
     microseconds are present. (see #1511)
 - obspy.io.zmap:
   * Use first origin/magnitude when writing to zmap if no origin/magnitude is
     set as preferred. (see #1569)
   * Parse origin time seconds as a float to avoid losing accuracy (see #1573)
 - obspy.signal:
   * PPSD: fix warning message on Python 3 that gets shown when waveforms and
     metadata mismatch (see #1506)
 - obspy.taup:
   * Allow for more than 10 phases with identical names (can happen for certain
     custom models, see #1593).

1.0.2

7 years ago

This is the second bug fix release in the 1.0.x series.

Full changelog:

1.0.2: (doi: 10.5281/zenodo.49636)
 - obspy.core:
   * Added workaround for numpy issue where many FFTs of various lengths fill
     a cache that never gets cleared, effectively creating a memory leak
     (see #1424).
   * Trace.filter and Stream.filter don't work on masked arrays anymore because
     it produced unpredictable results due to the un-initialized data-chunk.
     The uninitialized masked gap is now also initialized to np.nan in case
     of floating point data which and a consistent fill value in case of
     integer data. (see #1363)
 - obspy.clients.fdsn:
   * Fixing issue with location codes potentially resulting in unwanted data
     to be requested. (see #1422)
   * Included low-gain seismometers in default channel filters in
     mass-downloader, also included non-oriented channels by default
     (see #1373).
 - obspy.db:
   * Fixed a bug in obspy-indexer command line script (see #1369,
     command line script was not working, probably since 0.10.0)
 - obspy.imaging:
   * Fixed a bug that leads to pressure/tension color blending when plotting
     semi-transparent DC beachball patches (i.e. with "alpha" not equal to 1,
     see #1464)
   * Fixed a bug when plotting non-DC beachball patches without fill colors
     (i.e. with "nofill=True", see #1464)
   * Fix arbitrary units in waveform section plot's offset axis, making it
     possible to add customizations to the plot afterwards (see #1382, see
     #1383)
 - obspy.io.ascii:
   * Fixed a bug that lead to wrong header information in output files when
     writing non-integer sampling rate data to SLIST or TSPAIR formats
     (see #1447)
- obspy.io.cmtsolution:
   * Make sure newer CMTSOLUTION files can also be read (see #1479).
 - obspy.io.gse2:
   * Fixed a bug that could lead to network code not present in GSE2 output
     (see #1448)
 - obspy.io.mseed:
   * Fixed a bug in obspy-mseed-recordanalyzer (see #1386)
 - obspy.io.nlloc:
   * Use geographic coordinates from the NonLinLoc Hypocenter-Phase file if
     no custom coordinate converter is provided. (see #1390)
   * Fix reading NonLinLoc Hypocenter-Phase files with more than one
     hypocenter in it. (see #1480)
   * Fix reading NonLinLoc Hypocenter-Phase files with unicode characters in
     them. (see #1483)
 - obspy.io.quakeml:
   * Fixed issue with improperly raised warnings when the same file is read
     twice. (#1376)
   * Fix writing empty network/station/channel codes in WaveformStreamID
     objects to QuakeML. (see #1483)
 - obspy.io.sac:
   * Try to set SAC distances (dist, az, baz, gcarc) on read, if "lcalda" is
     true.  If "dist" header is found, distances aren't calculated.
   * SACTrace class returns header values as native Python types instead of
     NumPy types.
   * SACTrace.iqual is no longer accepts enumerated string values, but
     arbitrary integer values. (see #1472)
   * SACTrace.read now replaces non-ASCII and null-termination characters in
     string headers with whitespace unless the "debug_strings=True" flag is
     used. (see #1432)
 - obspy.io.stationxml:
   * Always set the number attribute for poles and zeros. (see #1481)
 - obspy.signal:
   * PPSD.plot(): fix plotting of percentiles, mode and mean and setting
     period limits when using "xaxis_frequency=True" (see #1406, #1416)
   * Work around a bug in SciPy that results in wrong results for bandpass
     filter when using Nyquist frequency (or higher) as high corner of the
     passband (see #1451)
 - obspy.taup:
   * Fixing path for Pn. (see #1392)