简短版本:我有两个TimeSeries(录制开始和录制结束)我想用作Panel(或DataFrame)中数据的索引。不是分层的,而是平行的。我不确定该怎么做。
长版:
我正在构建一个大熊猫面板,其中的一些数据类似于距离天线一定距离的温度和密度。正如我所看到的,最自然的结构是temp
和dens
作为项目(即Panel的子数据框架),记录时间为主轴(索引),因此距离天线的距离为短轴(colums)。
我的问题是:对于每次录音,乐器在一段时间内平均/积分。因此,对于每个数据转储,保存两个时间戳:开始记录和结束记录。我需要这两个。因此,我需要一些可能被称为“并行索引”的东西,其中两个不同的TimeSeries(startRec
和endRec
)作为索引工作,我可以得到任何我喜欢的某个数据点。当然,我并不需要两者都使用 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]
答案 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