【问题标题】:groupby with overlapping intervals timeseries具有重叠间隔时间序列的 groupby
【发布时间】:2016-12-17 10:21:19
【问题描述】:

我在 python pandas 数据框对象中有一个时间序列,我想根据索引创建一个组,但我想要重叠的组,即组不是不同的。 header_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

如果我在索引上进行分组,

  dfgroup=df.groupby(df.index)

这会每秒提供一组。合并这些组的最佳方法是什么?

【问题讨论】:

  • 每秒总是有 4 个条目吗?
  • 否,因为缺少数据。这些实际上是每秒收集的样本。实际数据每秒有 100 个样本,但有时会丢失条目。
  • 您问题中的示例不一致。第二组从 22:17:14 开始占用 2 行,但第三组从 22:17:15 开始不占用任何行。第一组从 22:17:15 获取所有值,但第二组不从 22:17:16 获取所有值。你能澄清一下吗?我在想,您需要的是给定秒的所有值 + 前一秒的最后 2 个值 + 下一秒的前 2 个值。对吗?
  • 每个组由一个 2 秒的窗口组成,但它以重叠的方式移动,其中只有前一秒的一半条目进入下一组。因此,从前一秒获取 1/2 个条目 + 当前秒 + 从下一秒获取 1/2 个条目。第三组占用前第二个条目的 1/2,即条目号 13 和 14 重复给出 13-20

标签: python pandas dataframe group-by time-series


【解决方案1】:

这里有一个技巧:

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)

【讨论】:

  • 我在这一行得到一个错误 prev_sec = df[df['header_sec'].isin(name - pd.to_timedelta(1, unit='s'))] 因为“header sec”是索引而不是列。我尝试将其替换为 df[df[df.index].isin(name - pd.to_timedelta(1, unit='s'))] 但仍然给出关键错误“TimedeltaIndex(['17004 days 22:17:13 ', '17004 天 22:17:13',\n '17004 天 22:17:13', '17004 天 ..... 不在索引中"
  • 编辑了我的答案。你需要df[df.index.isin(...)]
  • 我也试过了,但它仍然给出错误,只允许将类似列表的对象传递给 isin(),你传递了一个 [Timedelta]。这是因为我的索引已经是 timedelta。这是我在 groupby df.loc[:,['header_stamp_secs_x']] = pd.to_timedelta(df.header_stamp_secs_x, unit='s') df.set_index('header_stamp_secs_x', inplace=True) 之前所做的事情
  • 哦,是的……那个。抱歉疏忽。该名称只是一个实体,而不是列表。我的错误,我真诚地为来回道歉。对答案的编辑应该有效。
  • 很抱歉我是数据框的新手,但它不起作用。我认为因为我的索引是 timedelta 并且它说只允许将类似列表的对象传递给 isin(),所以您传递了 [timedelta64] print type(name - np.timedelta64(1, 's'))
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多