大熊猫中的“并行”索引(非分层)

时间:2013-11-11 11:29:30

标签: python indexing pandas

简短版本:我有两个TimeSeries(录制开始和录制结束)我想用作Panel(或DataFrame)中数据的索引。不是分层的,而是平行的。我不确定该怎么做。

长版:

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

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

我当然可以将两个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]

1 个答案:

答案 0 :(得分: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