访问时间序列中的数据#
访问数据#
对于本页中的示例,我们将考虑具有两个数据列的采样时间序列- flux
和 temp
::
>>> 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_start
, time_bin_center
和 time_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_start
和 time_bin_size
作为实际列可用,并且 time_bin_center
和 time_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
通过提取 flux
和 temp
柱::
>>> 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
还可以使用中描述的功能自动索引对象 表索引 . 这样就可以使用 loc
和 iloc
属性。
这个 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时间字符串,则不需要此选项。至于 QTable
和 Table
类 loc
属性,以便与 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