Python 具有重叠间隔的groupby时间序列

Python 具有重叠间隔的groupby时间序列,python,pandas,dataframe,group-by,time-series,Python,Pandas,Dataframe,Group By,Time Series,我在python中有一个数据帧对象的时间序列,我想创建一个基于索引的组,但我想要重叠的组,即组不是不同的。标题_sec是索引列。 每组由一个2秒的窗口组成。 输入数据帧 header_sec 1 17004 days 22:17:13 2 17004 days 22:17:13 3 17004 days 22:17:13 4 17004 days 22:17:13 5 17004 days 22:17:14 6 17004 days 22:17:14 7 17004

我在python中有一个数据帧对象的时间序列,我想创建一个基于索引的组,但我想要重叠的组,即组不是不同的。标题_sec是索引列。 每组由一个2秒的窗口组成。 输入数据帧

    header_sec
1  17004 days 22:17:13 
2  17004 days 22:17:13 
3  17004 days 22:17:13 
4  17004 days 22:17:13 
5  17004 days 22:17:14
6  17004 days 22:17:14
7  17004 days 22:17:14
8  17004 days 22:17:14
9  17004 days 22:17:15
10 17004 days 22:17:15
11 17004 days 22:17:15
12 17004 days 22:17:15
13 17004 days 22:17:16
14 17004 days 22:17:16
15 17004 days 22:17:16
16 17004 days 22:17:16
17 17004 days 22:17:17
18 17004 days 22:17:17
19 17004 days 22:17:17
20 17004 days 22:17:17
我的第一组应该有

1  17004 days 22:17:13 
2  17004 days 22:17:13 
3  17004 days 22:17:13 
4  17004 days 22:17:13 
5  17004 days 22:17:14
6  17004 days 22:17:14
7  17004 days 22:17:14
8  17004 days 22:17:14
第二组从上一个索引开始,并获取上一个索引中的1/2记录

7  17004 days 22:17:14
8  17004 days 22:17:14
9  17004 days 22:17:15
10 17004 days 22:17:15
11 17004 days 22:17:15
12 17004 days 22:17:15
13 17004 days 22:17:16
14 17004 days 22:17:16
第三组

13 17004 days 22:17:16
14 17004 days 22:17:16
15 17004 days 22:17:16
16 17004 days 22:17:16
17 17004 days 22:17:17
18 17004 days 22:17:17
19 17004 days 22:17:17
20 17004 days 22:17:17
如果我在索引上做groupby

  dfgroup=df.groupby(df.index)
这使得每秒有一组。合并这些组的最佳方法是什么?

以下是一种技巧:

import numpy as np # if you have not already done this

grouped = df.groupby(df.index)

for name, group in grouped:
    try:
        prev_sec = df.loc[(name - pd.to_timedelta(1, unit='s')), :]
    except KeyError:
        prev_sec = pd.DataFrame(columns=group.columns)
    try:
        next_sec = df.loc[(name + pd.to_timedelta(1, unit='s')), :]
    except KeyError:
        next_sec = pd.DataFrame(columns=group.columns)
    Pn = 2 # replace this with int(len(prev_sec)/2) to get half rows from previous second
    Nn = 2 # replace this with int(len(next_sec)/2) to get half rows from next second
    group = pd.concat([prev_sec.iloc[-Pn:,:], group, next_sec.iloc[:Nn,:]])

    # Replace the below lines with your operations
    print(name, group)

是否总是每秒有4个条目?否,因为缺少数据。这些实际上是每秒采集的样本。实际数据每秒有100个样本,但有时缺少一个条目。您问题中的示例不一致。第二组从22:17:14开始取2行,但第三组不从22:17:15开始取任何行。第一组获取22:17:15的所有值,但第二组不获取22:17:16的所有值。你能澄清一下吗?我在想,你需要的是给定秒的所有值+前一秒的最后2个值+下一秒的前2个值。正确吗?每个组都有一个2秒的窗口,但它以重叠的方式移动,其中只有前一秒的一半条目进入下一组。因此,从前一秒中提取1/2个条目+当前第二秒中提取1/2个条目+从下一秒中提取1/2个条目。第三组获取前一秒的1/2条目,即重复条目编号13和14,给出13-20I,在此行prev_sec=df[df['header_sec'].isin(name-pd.to_timedelta(1,unit='s'))处出错,因为“header sec”是索引,而不是列。我尝试将其替换为df[df.index].isin(name-pd.to_timedelta(1,unit='s')),但仍然给出了一个关键错误“TimedeltaIndex(['17004 days 22:17:13','17004 days 22:17:13',\n'17004 days 22:17:13','17004 days…..不在索引中”编辑了我的答案。您需要
df[df.index.isin(…)]
。我也试过了,但它仍然给出了一个只允许将对象传递给isin()的错误列表,您传递了一个[Timedelta]这是因为我的索引已经是timedelta。这是我在groupby df.loc[:,['header\u stamp\u secs\u x']=pd.to\u timedelta(df.header\u stamp\u secs\u x,unit='s')df.set\u index('header\u stamp\u secs\u x',inplace=True)之前所做的操作哦,是的……那个。很抱歉疏忽了。名称只是一个实体,而不是列表。我的错误,我真诚地为来回表示歉意。对答案的编辑应该会起作用。很抱歉,作为数据帧的新手,它不起作用。我想因为我的索引是timedelta,它说只有类似列表的对象才允许传递给is在()中,您传递了[timedelta64]打印类型(名称-np.timedelta64(1,'s'))