Creating Time Series#

Initializing a Time Series#

The first type of time series that we will look at here is a |TimeSeries| object, which can be used for a time series which samples a continuous variable at discrete, instantaneous times. Initializing a |TimeSeries| object can be done in the same ways as initializing a |Table| object (see Data Tables), but additional arguments related to the times should be specified.

Evenly Sampled Time Series#

The most convenient way to construct an evenly sampled |TimeSeries| is to specify the start time, the time interval, and the number of samples:

>>> from astropy import units as u
>>> from astropy.timeseries import TimeSeries
>>> ts1 = TimeSeries(time_start='2016-03-22T12:30:31',
...                  time_delta=3 * u.s,
...                  n_samples=5)
>>> ts1
<TimeSeries length=5>
          time
          Time
-----------------------
2016-03-22T12:30:31.000
2016-03-22T12:30:34.000
2016-03-22T12:30:37.000
2016-03-22T12:30:40.000
2016-03-22T12:30:43.000

The time keyword argument can be set to anything that can be passed to the |Time| class (see also Time and Dates) or |Time| objects directly. Note that the n_samples argument is only needed if you are not also passing in data during initialization (see Passing Data During Initialization).

Arbitrarily Sampled Time Series#

To construct a sampled time series with samples at arbitrary times, you can pass multiple times to the time argument:

>>> ts2 = TimeSeries(time=['2016-03-22T12:30:31',
...                        '2016-03-22T12:30:38',
...                        '2016-03-22T12:34:40'])
>>> ts2
<TimeSeries length=3>
          time
          Time
-----------------------
2016-03-22T12:30:31.000
2016-03-22T12:30:38.000
2016-03-22T12:34:40.000

You can also specify a vector |Time| object directly as the time= argument, or a vector |TimeDelta| argument or a quantity array to the time_delta= argument.:

>>> TimeSeries(time_start="2011-01-01T00:00:00",
...            time_delta=[0.1, 0.2, 0.1, 0.3, 0.2]*u.s)
<TimeSeries length=5>
         time
         Time
-----------------------
2011-01-01T00:00:00.000
2011-01-01T00:00:00.100
2011-01-01T00:00:00.300
2011-01-01T00:00:00.400
2011-01-01T00:00:00.700

Initializing a Binned Time Series#

The |BinnedTimeSeries| can be used to represent time series where each entry corresponds to measurements taken over a range in time — for instance, a light curve constructed by binning X-ray photon events. This class supports equal-size or uneven bins, and contiguous and non-contiguous bins. As for |TimeSeries|, initializing a |BinnedTimeSeries| can be done in the same ways as initializing a |Table| object (see Data Tables), but additional arguments related to the times should be specified as described below.

Equal-Sized Contiguous Bins#

To create a binned time series with equal-size contiguous bins, it is sufficient to specify a start time as well as a bin size:

>>> from astropy.timeseries import BinnedTimeSeries
>>> ts3 = BinnedTimeSeries(time_bin_start='2016-03-22T12:30:31',
...                        time_bin_size=3 * u.s, n_bins=10)
>>> ts3
<BinnedTimeSeries length=10>
    time_bin_start     time_bin_size
                             s
          Time             float64
----------------------- -------------
2016-03-22T12:30:31.000           3.0
2016-03-22T12:30:34.000           3.0
2016-03-22T12:30:37.000           3.0
2016-03-22T12:30:40.000           3.0
2016-03-22T12:30:43.000           3.0
2016-03-22T12:30:46.000           3.0
2016-03-22T12:30:49.000           3.0
2016-03-22T12:30:52.000           3.0
2016-03-22T12:30:55.000           3.0
2016-03-22T12:30:58.000           3.0

Note that the n_bins argument is only needed if you are not also passing in data during initialization (see Passing Data During Initialization).

Uneven Contiguous Bins#

When creating a binned time series with uneven contiguous bins, the bin size can be changed to give multiple values (note that in this case n_bins is not required):

>>> ts4 = BinnedTimeSeries(time_bin_start='2016-03-22T12:30:31',
...                        time_bin_size=[3, 3, 2, 3] * u.s)
>>> ts4
<BinnedTimeSeries length=4>
     time_bin_start     time_bin_size
                              s
          Time             float64
----------------------- -------------
2016-03-22T12:30:31.000           3.0
2016-03-22T12:30:34.000           3.0
2016-03-22T12:30:37.000           2.0
2016-03-22T12:30:39.000           3.0

Alternatively, you can create the same time series by giving an array of start times as well as a single end time:

>>> ts5 = BinnedTimeSeries(time_bin_start=['2016-03-22T12:30:31',
...                                        '2016-03-22T12:30:34',
...                                        '2016-03-22T12:30:37',
...                                        '2016-03-22T12:30:39'],
...                        time_bin_end='2016-03-22T12:30:42')
>>> ts5  
<BinnedTimeSeries length=4>
     time_bin_start        time_bin_size
                                s
         Time                float64
----------------------- -----------------
2016-03-22T12:30:31.000               3.0
2016-03-22T12:30:34.000               3.0
2016-03-22T12:30:37.000               2.0
2016-03-22T12:30:39.000               3.0

Uneven Non-Contiguous Bins#

To create a binned time series with non-contiguous bins, you can either specify an array of start times and bin widths:

>>> ts6 = BinnedTimeSeries(time_bin_start=['2016-03-22T12:30:31',
...                                        '2016-03-22T12:30:38',
...                                        '2016-03-22T12:34:40'],
...                        time_bin_size=[5, 100, 2]*u.s)
>>> ts6
<BinnedTimeSeries length=3>
     time_bin_start     time_bin_size
                              s
          Time             float64
----------------------- -------------
2016-03-22T12:30:31.000           5.0
2016-03-22T12:30:38.000         100.0
2016-03-22T12:34:40.000           2.0

Or in the most general case, you can also specify multiple times for time_bin_start and time_bin_end:

>>> ts7 = BinnedTimeSeries(time_bin_start=['2016-03-22T12:30:31',
...                                        '2016-03-22T12:30:33',
...                                        '2016-03-22T12:30:40'],
...                        time_bin_end=['2016-03-22T12:30:32',
...                                      '2016-03-22T12:30:35',
...                                      '2016-03-22T12:30:41'])
>>> ts7  
<BinnedTimeSeries length=3>
    time_bin_start        time_bin_size
                                s
          Time               float64
----------------------- ------------------
2016-03-22T12:30:31.000                1.0
2016-03-22T12:30:33.000                2.0
2016-03-22T12:30:40.000                1.0

Adding Data to the Time Series#

The above examples show how to initialize |TimeSeries| objects, but these do not include any data aside from the times. There are different ways of adding data, as with the |Table| class.

Passing Data During Initialization#

It is possible to pass data during the initialization of a |TimeSeries| object, as for |Table| objects. For instance:

>>> ts8 = BinnedTimeSeries(time_bin_start=['2016-03-22T12:30:31',
...                                        '2016-03-22T12:30:34',
...                                        '2016-03-22T12:30:37',
...                                        '2016-03-22T12:30:39'],
...                        time_bin_end='2016-03-22T12:30:42',
...                        data={'flux': [1., 4., 5., 6.] * u.mJy})
>>> ts8  
<BinnedTimeSeries length=4>
      time_bin_start     time_bin_size     flux
                               s            mJy
          Time              float64       float64
----------------------- ----------------- -------
2016-03-22T12:30:31.000               3.0     1.0
2016-03-22T12:30:34.000               3.0     4.0
2016-03-22T12:30:37.000               2.0     5.0
2016-03-22T12:30:39.000               3.0     6.0

Adding Data After Initialization#

Once a |TimeSeries| object is initialized, you can add columns/fields to it as you would for a |Table| object:

>>> from astropy import units as u
>>> ts1['flux'] = [1., 4., 5., 6., 4.] * u.mJy
>>> ts1
<TimeSeries length=5>
          time            flux
                          mJy
          Time          float64
----------------------- -------
2016-03-22T12:30:31.000     1.0
2016-03-22T12:30:34.000     4.0
2016-03-22T12:30:37.000     5.0
2016-03-22T12:30:40.000     6.0
2016-03-22T12:30:43.000     4.0

Adding Rows#

Adding rows to |TimeSeries| or |BinnedTimeSeries| can be done using the add_row() method, as for |Table| and |QTable|. This method takes a dictionary where the keys are column names:

>>> ts8.add_row({'time_bin_start': '2016-03-22T12:30:44.000',
...              'time_bin_size': 2 * u.s,
...              'flux': 3 * u.mJy})
>>> ts8  
<BinnedTimeSeries length=5>
    time_bin_start       time_bin_size      flux
                                s           mJy
          Time               float64      float64
----------------------- ----------------- -------
2016-03-22T12:30:31.000               3.0     1.0
2016-03-22T12:30:34.000               3.0     4.0
2016-03-22T12:30:37.000               2.0     5.0
2016-03-22T12:30:39.000               3.0     6.0
2016-03-22T12:30:44.000               2.0     3.0

If you want to be able to skip some values when adding rows, you should make sure that masking is enabled — see Masking Values in Time Series for more details.