pandas中的“并行”索引(不分层次)

2024-05-29 02:44:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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

长版:

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

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

当然,我可以将这两个时间序列保存在一个单独的数据帧中,但是由于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的输出:

^{pr2}$

在这里,长轴当前只是一个基于整数的索引(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]

Tags: 数据import面板距离pandasdatadatetimenp
1条回答
网友
1楼 · 发布于 2024-05-29 02:44:54

在一个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'))

结果是:

^{pr2}$

相关问题 更多 >

    热门问题