当前位置: 首页 > 知识库问答 >
问题:

熊猫时间序列多重切片

郗缪文
2023-03-14

我可以从pandas文档中看出,您可以:

df.loc[['a','b','c'],:]

对于时间序列,您为什么不能:

x = df.loc[['2005-10-27 14:30':'2005-10-27 15:15', '2006-04-14 14:40':'2006-04-14 15:20', '2008-01-25 14:30':'2008-01-25 15:30'],:]

我得到一个语法错误。不能在时间序列上执行多个切片范围吗?有解决办法吗?

共有2个答案

皇甫繁
2023-03-14

虽然DataFrame索引将接受列索引列表,但它不接受行切片对象列表。

这应该做你想要的,它循环通过你想要的范围编译一个新的数据帧。

import numpy as np
import pandas as pd

# let's create some fake data
date_range = pd.date_range('2005-01-01', '2008-12-31', freq='9min')
l = len(date_range)
df = pd.DataFrame({'normal': np.random.randn(l), 'uniform':np.random.rand(l), 
    'datetime':date_range, 'integer':range(l)}, index=date_range)

# let's identify the periods we want
desired = [('2005-10-27 14:30','2005-10-27 15:15'), 
           ('2006-04-14 14:40','2006-04-14 15:20'), 
           ('2008-01-25 14:30','2008-01-25 15:30')]

# let's loop through the desired ranges and compile our selection           
x = pd.DataFrame()
for (start, stop) in desired:
    selection = df[(df.index >= pd.Timestamp(start)) & 
        (df.index <= pd.Timestamp(stop))]
    x = x.append(selection)

# and let's have a look at what we found ...
print(x)
郑正文
2023-03-14

这个问题提到numpy。但我不知道如何让它与切片列表一起工作,所以我使用了hstack和arange

import numpy as np
import pandas as pd

def loop_version(df, desired):
    # let's loop through the desired ranges and compile our selection           
    x = pd.DataFrame()
    for (start, stop) in desired:
        selection = df[(df.index >= pd.Timestamp(start)) & 
            (df.index <= pd.Timestamp(stop))]
        x = x.append(selection)

    # and let's have a look at what we found ...
    return x

def vectorized_version(df, desired):
    # first flatten the list
    times = np.array(desired).flatten()
    # use searchsorted to find the indices of the 
    # desired times in df's index
    ndxlist = df.index.searchsorted(np.array(times))
    # use np.arange to convert pairs of values in ndxlist to a 
    # range of indices, similar to np.r_
    ndxlist = np.hstack([np.arange(i1, i2) for i1, i2 in 
                        zip(ndxlist[::2], ndxlist[1::2])])
    return df.iloc[ndxlist]

In [2]: # let's create some fake data
In [3]: date_range = pd.date_range('2005-01-01', '2008-12-31', freq='9min')
In [4]: l = len(date_range)
In [5]: df = pd.DataFrame({'normal': np.random.randn(l), 'uniform':np.random.rand(l), 
   ...:     'datetime':date_range, 'integer':range(l)}, index=date_range)
In [6]: # let's identify the periods we want
   ...: desired = [('2005-10-27 14:30','2005-10-27 15:15'), 
   ...:            ('2006-04-14 14:40','2006-04-14 15:20'), 
   ...:            ('2008-01-25 14:30','2008-01-25 15:30')]

In [7]: loop_version(df, desired).equals(vectorized_version(df, desired))
Out[7]: True

In [8]: % timeit loop_version(df, desired)
5.53 ms ± 225 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [9]: % timeit vectorized_version(df, desired)
308 µs ± 1.26 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
 类似资料:
  • 问题内容: 给定下面的熊猫DataFrame: 我想对数据重新采样以每小时计数一次,同时按位置分组以生成如下所示的数据框: 我尝试了resample()和groupby()的各种组合,但是没有运气。我将如何处理? 问题答案: 在我的原始帖子中,我建议使用。如今,使用代替。语法在很大程度上是相同的,但现在已不支持。 此外,虽然只能按DatetimeIndex分组,但可以按日期时间 列进行分组,而您可

  • 问题内容: 我有一个包含多个列的数据集,我希望对其进行一次热编码。但是,我不想为每个编码都有编码,因为所说的列与所说的项目有关。我想要的是一组使用所有列的虚拟变量。请参阅我的代码以获得更好的解释。 假设我的数据框如下所示: 如果我执行 输出将是 但是,我想获得的是这样的东西: 代替具有表示编码,例如多列的和,我只希望有一组(,,等等)与值时任何在列中的值的,,显示出来。 需要说明的是,在我的原始数

  • 我有一个单一的CSV文件,在其中我想重命名一些列相同的名称。我的初始代码如下所示 我用这段代码从dataframe中提取了选定的列 此切片每隔三列获取一次。现在我想用相同的名称重命名每三列一次,但这样重命名我的列会出错 有没有办法在pandas中重命名多个同名列? 除了手动操作,还有其他建议吗?

  • 问题内容: 如何将大熊猫中的时间序列重新采样为每周从任意一天开始的每周频率?我看到有一个可选的关键字库,但它仅适用于少于一天的时间间隔。 问题答案: 您可以将锚定的偏移量传递给,以及它们涵盖此情况的其他选项。 例如,星期一的每周频率:

  • 问题内容: 为创建这个问题的重复而道歉。我有一个数据框,其形状大致如下图所示: 返回: 我将需要重新采样以得出每日滚动平均值,即应用。 我尝试了两种方法: 1 -拆垛和堆积,建议在这里 这返回一个错误 2 -使用,建议在这里 这不会返回错误,但似乎并没有适当地对df重新采样/分组。结果似乎包含每小时数据点,而不是每天: 问题答案: 首先让我们定义一个重采样函数: 然后,我们对job_id进行分组并

  • 我已经看到了将一个列/系列分解成熊猫数据框架的多个列这一主题的一些变体,但是我一直在尝试做一些事情,但是现有的方法并没有真正成功。 给定如下数据帧: 我想将系列中的项目转换为列,以 值作为值,如下所示: 我觉得这应该是一个相对简单的问题,但我已经为此努力了几个小时,不断增加的复杂程度,但没有成功。