Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python &引用;平行;熊猫索引(非分层)_Python_Indexing_Pandas - Fatal编程技术网

Python &引用;平行;熊猫索引(非分层)

Python &引用;平行;熊猫索引(非分层),python,indexing,pandas,Python,Indexing,Pandas,简短版本:我有两个时间序列(录制开始和录制结束),我想用作面板(或数据帧)中数据的索引。不是等级的,而是平行的。我不知道怎么做 长版本: 我正在构建一个pandas面板,其中包含一些类似于天线一定距离处的温度和密度的数据。在我看来,最自然的结构是将例如temp和dens作为项目(即面板的子数据帧),将时间记录为长轴(索引),从而将与天线的距离记录为短轴(柱) 我的问题是:对于每次录音,仪器在一定时间内平均/积分。因此,对于每个数据转储,保存两个时间戳:开始记录和结束记录。这两个我都需要。因此,我

简短版本:我有两个时间序列(录制开始和录制结束),我想用作面板(或数据帧)中数据的索引。不是等级的,而是平行的。我不知道怎么做

长版本:

我正在构建一个pandas面板,其中包含一些类似于天线一定距离处的温度和密度的数据。在我看来,最自然的结构是将例如
temp
dens
作为项目(即面板的子数据帧),将时间记录为长轴(索引),从而将与天线的距离记录为短轴(柱)

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

当然,我可以将这两个时间序列保存在一个单独的数据帧中,但由于pandas的主要特点是自动数据对齐,这并不理想

我如何才能最好地实现这一点

示例数据 在距天线两个距离处进行三次记录的样本面板:

将熊猫作为pd导入
将numpy作为np导入
data=pd.Panel(data={'temp':np.array[21,20],
[19, 17],
[15, 14]]),
“dens”:np.array([[10011002],
[1000, 998],
[997, 995]])},
短轴=['1m','3m'])
数据的输出


尺寸:2(项目)x 3(长轴)x 2(短轴)
项目轴:从密度到温度
长轴:0到2
短轴:1m至3m
此处,长轴当前仅为基于整数的索引(0到2)。短轴是距离天线的两个测量距离

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

从日期时间导入日期时间
startRec=pd.TimeSeries([datetime(2013,11,11,15,00,00),
日期时间(2013,11,12,15,00,00),
日期时间(2013,11,13,15,00,00)])
endRec=pd.TimeSeries([datetime(2013,11,11,15,00,10),
日期时间(2013,11,12,15,00,10),
日期时间(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
数据类型:datetime64[ns]

面板中
会让这变得有点棘手。我通常坚持使用
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'))

如果我理解正确,在两列上创建一个索引应该可以正常工作。我一直在用风暴过程中收集的水质样本来做这件事。添加了样本数据@PaulH:你能发布一个详细说明你的方法的答案吗?你忘了定义面板
data
,例如
data=pd.Panel(data={'1m':_data1m,'3m':_data3m})
。请用这行代码更新您的答案。不幸的是,使用基于多索引的方法似乎不可能轻松获得给定日期/时间的数据,而是需要使用
。选择
lambda
。对于我的问题,可能最简单的解决方案,虽然没有我想要的那么理想,但就是将录制的中间部分作为索引,并在另一个数据帧(具有相同索引)中查找开始/结束。@cmeeren哇哇。很抱歉<代码>lambdas
可能是一种痛苦,而且可能会让代码变得非常混乱,依我看。但它们也可能非常强大和方便。
                                         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