0

简短版本:我有两个 TimeSeries(记录开始和记录结束)我想用作面板(或 DataFrame)中数据的索引。不是分层的,而是并行的。我不确定如何做到这一点。

长版:

我正在构建一个熊猫面板,其中包含一些类似于距天线一定距离的温度和密度的数据。正如我所看到的,最自然的结构是将例如tempdens作为项目(即面板的子数据帧),将时间记录为长轴(索引),因此与天线的距离作为短轴(列)。

我的问题是:对于每个记录,仪器在一段时间内平均/积分。因此,对于每个数据转储,都会保存两个时间戳:开始记录和结束记录。我需要这两个。因此,我需要一些可能被称为“并行索引”的东西,其中两个不同的 TimeSeries (startRecendRec) 作为索引工作,对于某个数据点,我可以获得我喜欢的任何一个。当然,我真的不需要同时为两者索引,但两者都需要在数据结构中自然可用。例如,对于任何给定的温度或密度记录,我需要能够同时获得记录的开始时间和结束时间。

我当然可以将两个 TimeSeries 保存在单独的 DataFrame 中,但是 pandas 的要点是自动数据对齐,这并不是很理想。

我怎样才能最好地做到这一点?

示例数据

距天线两个距离处具有三个记录的示例面板:

import pandas as pd
import numpy as np

data = pd.Panel(data={'temp': np.array([[21, 20],
                                        [19, 17],
                                        [15, 14]]),
                      'dens': np.array([[1001, 1002],
                                        [1000, 998],
                                        [997, 995]])},
                minor_axis=['1m', '3m'])

输出data

<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 3 (major_axis) x 2 (minor_axis)
Items axis: dens to temp
Major_axis axis: 0 to 2
Minor_axis axis: 1m to 3m

在这里,主轴目前只是一个基于整数的索引(0 到 2)。短轴是距天线的两个测量距离。

我有两个TimeSeries我想用作索引:

from datetime import datetime
startRec = pd.TimeSeries([datetime(2013, 11, 11, 15, 00, 00),
                          datetime(2013, 11, 12, 15, 00, 00),
                          datetime(2013, 11, 13, 15, 00, 00)])

endRec = pd.TimeSeries([datetime(2013, 11, 11, 15, 00, 10),
                        datetime(2013, 11, 12, 15, 00, 10),
                        datetime(2013, 11, 13, 15, 00, 10)])

输出startRec

0   2013-11-11 15:00:00
1   2013-11-12 15:00:00
2   2013-11-13 15:00:00
dtype: datetime64[ns]
4

1 回答 1

0

在一个Panel使这有点棘手。我通常坚持使用DataFrames.

但这看起来如何:

import pandas as pd
from datetime import datetime
startRec = pd.TimeSeries([datetime(2013, 11, 11, 15, 0, 0),
                          datetime(2013, 11, 12, 15, 0, 0),
                          datetime(2013, 11, 13, 15, 0, 0)])

endRec = pd.TimeSeries([datetime(2013, 11, 11, 15, 0, 10),
                        datetime(2013, 11, 12, 15, 0, 10),
                        datetime(2013, 11, 13, 15, 0, 10)])
_data1m = pd.DataFrame(data={
                          'temp': np.array([21, 19, 15]),
                          'dens': np.array([1001, 1000, 997]),
                          'start': startRec,
                          'end': endRec
                          }
                    )

_data3m = pd.DataFrame(data={
                          'temp': np.array([20, 17, 14]),
                          'dens': np.array([1002, 998, 995]),
                          'start': startRec,
                          'end': endRec
                          }
                    )


_data1m.set_index(['start', 'end'], inplace=True)
_data3m.set_index(['start', 'end'], inplace=True)

data = pd.Panel(data={'1m': _data1m, '3m': _data3m}) 
data.loc['3m'].select(lambda row: row[0] < pd.Timestamp('2013-11-12') or 
                                  row[1] < pd.Timestamp('2013-11-13'))

并输出:

                                         dens  temp
start               end                            
2013-11-11 15:00:00 2013-11-11 15:00:10  1002    20
2013-11-12 15:00:00 2013-11-12 15:00:10   998    17
于 2013-11-13T21:23:20.580 回答