Stream.decimate(factor, no_filter=False, strict_length=False)[source]

Downsample data in all traces of stream by an integer factor.

  • factor (int) Factor by which the sampling rate is lowered by decimation.
  • no_filter (bool, optional) Deactivates automatic filtering if set to True. Defaults to False.
  • strict_length (bool, optional) Leave traces unchanged for which end time of trace would change. Defaults to False.

Currently a simple integer decimation is implemented. Only every decimation_factor-th sample remains in the trace, all other samples are thrown away. Prior to decimation a lowpass filter is applied to ensure no aliasing artifacts are introduced. The automatic filtering can be deactivated with no_filter=True.

If the length of the data array modulo decimation_factor is not zero then the end time of the trace is changing on sub-sample scale. To abort downsampling in case of changing end times set strict_length=True.


The Stream object has three different methods to change the sampling rate of its data: resample(), decimate(), and interpolate()

Make sure to choose the most appropriate one for the problem at hand.


This operation is performed in place on the actual data arrays. The raw data is not accessible anymore afterwards. To keep your original data, use copy() to create a copy of your stream object. This also makes an entry with information on the applied processing in stats.processing of every trace.


For the example we switch off the automatic pre-filtering so that the effect of the downsampling routine becomes clearer.

>>> from obspy import Trace, Stream
>>> tr = Trace(data=np.arange(10))
>>> st = Stream(traces=[tr])
>>> tr.stats.sampling_rate
>>> tr.data
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> st.decimate(4, strict_length=False, no_filter=True)
<...Stream object at 0x...>
>>> tr.stats.sampling_rate
>>> tr.data
array([0, 4, 8])