访问时间序列中的数据#

访问数据#

对于本页中的示例,我们将考虑具有两个数据列的采样时间序列- fluxtemp ::

>>> from astropy import units as u
>>> from astropy.timeseries import TimeSeries
>>> ts = TimeSeries(time_start='2016-03-22T12:30:31',
...                 time_delta=3 * u.s,
...                 data={'flux': [1., 4., 5., 3., 2.] * u.Jy,
...                       'temp': [40., 41., 39., 24., 20.] * u.K},
...                 names=('flux', 'temp'))

至于 Table ,可以按名称访问列:

>>> ts['flux']  
<Quantity [ 1., 4., 5., 3., 2.] Jy>
>>> ts['time']
<Time object: scale='utc' format='isot' value=['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']>

可以通过索引访问行:

>>> ts[0]
<Row index=0>
          time            flux    temp
                           Jy      K
          Time          float64 float64
----------------------- ------- -------
2016-03-22T12:30:31.000     1.0    40.0

然后可以通过访问列和行来访问单个值,反之亦然:

>>> ts[0]['flux']  
<Quantity 1. Jy>

>>> ts['temp'][2]  
<Quantity 39. K>

访问时间#

为了 TimeSeries , the time 可以使用常规的列访问表示法访问列,如中所示 Accessing Data ,但也可以更方便地使用 time 属性:

>>> ts.time
<Time object: scale='utc' format='isot' value=['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']>

为了 BinnedTimeSeries ,我们提供三个属性: time_bin_starttime_bin_centertime_bin_end ::

>>> from astropy.timeseries import BinnedTimeSeries
>>> bts = BinnedTimeSeries(time_bin_start='2016-03-22T12:30:31',
...                        time_bin_size=3 * u.s, n_bins=5)
>>> bts.time_bin_start
<Time object: scale='utc' format='isot' value=['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']>
>>> bts.time_bin_center
<Time object: scale='utc' format='isot' value=['2016-03-22T12:30:32.500' '2016-03-22T12:30:35.500'
 '2016-03-22T12:30:38.500' '2016-03-22T12:30:41.500'
 '2016-03-22T12:30:44.500']>
>>> bts.time_bin_end
<Time object: scale='utc' format='isot' value=['2016-03-22T12:30:34.000' '2016-03-22T12:30:37.000'
 '2016-03-22T12:30:40.000' '2016-03-22T12:30:43.000'
 '2016-03-22T12:30:46.000']>

此外, time_bin_size 属性可用于访问存储箱大小:

>>> bts.time_bin_size  
<Quantity [3., 3., 3., 3., 3.] s>

请注意 time_bin_starttime_bin_size 作为实际列可用,并且 time_bin_centertime_bin_end 是动态计算的。

在不同的时间表示之间转换 有关在不同的时间表示之间更改的详细信息。

提取列的子集#

我们可以用 flux 列为:

>>> ts['time', 'flux']
<TimeSeries length=5>
          time            flux
                           Jy
          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     3.0
2016-03-22T12:30:43.000     2.0

请注意,新列将是原始列的副本(而不是视图)。我们也可以创造一个平原 QTable 通过提取 fluxtemp 柱::

>>> ts['flux', 'temp']
<QTable length=5>
  flux    temp
    Jy      K
float64 float64
------- -------
    1.0    40.0
    4.0    41.0
    5.0    39.0
    3.0    24.0
    2.0    20.0

提取行的子集#

TimeSeries 对象可以按行切片,使用与for相同的语法 Time 例如:

>>> ts[0:2]
<TimeSeries length=2>
          time            flux    temp
                           Jy      K
          Time          float64 float64
----------------------- ------- -------
2016-03-22T12:30:31.000     1.0    40.0
2016-03-22T12:30:34.000     4.0    41.0

TimeSeries 还可以使用中描述的功能自动索引对象 表索引 . 这样就可以使用 lociloc 属性。

这个 loc 属性可用于切片 TimeSeries 按时间排列的对象。例如,可以使用以下命令提取给定时间戳的所有条目:

>>> from astropy.time import Time
>>> ts.loc[Time('2016-03-22T12:30:31.000')]  
<Row index=0>
          time            flux    temp
                           Jy      K
          Time          float64 float64
----------------------- ------- -------
2016-03-22T12:30:31.000     1.0    40.0

或者在一个时间范围内:

>>> ts.loc['2016-03-22T12:30:30':'2016-03-22T12:30:41']
<TimeSeries length=4>
          time            flux    temp
                           Jy      K
          Time          float64 float64
----------------------- ------- -------
2016-03-22T12:30:31.000     1.0    40.0
2016-03-22T12:30:34.000     4.0    41.0
2016-03-22T12:30:37.000     5.0    39.0
2016-03-22T12:30:40.000     3.0    24.0

请注意,在本例中,我们没有指定 Time -如果字符串是ISO 8601时间字符串,则不需要此选项。至于 QTableTableloc 属性,以便与 pandas ,中的最后一项 loc 范围包括在内。

另外,还注意,结果将始终按时间排序。同样 iloc 属性可用于从时间序列中提取行 按时间排序 ,因此,例如,前两个条目(按时间)可以通过以下方式访问:

>>> ts.iloc[0:2]
<TimeSeries length=2>
          time            flux    temp
                           Jy      K
          Time          float64 float64
----------------------- ------- -------
2016-03-22T12:30:31.000     1.0    40.0
2016-03-22T12:30:34.000     4.0    41.0