【问题标题】:How to group consecutive values in reguarly time spaced series?如何对定期时间间隔序列中的连续值进行分组?
【发布时间】:2020-03-05 19:26:40
【问题描述】:

我需要分别分析包含在规则间隔时间序列中的孔之间的记录。

作为以下时间序列的示例,每 6 秒有规律地间隔,00:24 和 00:54 之间有一个间隔:

2018-01-01 00:00:00     4.2
2018-01-01 00:00:06     4.1
2018-01-01 00:00:12     4.3
2018-01-01 00:00:18     3.4
2018-01-01 00:00:24     4.7
2018-01-01 00:00:54     3.3
2018-01-01 00:01:00     8.2

我需要分别分析以下两组:

第一组:

2018-01-01 00:00:00     4.2
2018-01-01 00:00:06     4.1
2018-01-01 00:00:12     4.3
2018-01-01 00:00:18     3.4
2018-01-01 00:00:24     4.7

第二组:

2018-01-01 00:00:54     3.3
2018-01-01 00:01:00     8.2

一个巨大的数据集中包含多个洞,分析需要比较连续的组。

这里遵循一些代码来重现示例:

data_index = pd.DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 00:00:
06','2018-01-01 00:00:12','2018-01-01 00:00:18', '2018-01-01 00:00:24', '2018-01-01 00:00:54', '2018-01-01 00:01:00'])
data = [4.2, 4.1,4.3,3.4, 4.7, 3.3, 8.2]
df = pd.DataFrame(data_index, columns=['date'])
df['datetime'] = pd.to_datetime(df['date'])
df = df.set_index('datetime')
df.drop(['date'], axis=1, inplace=True)
df['data'] = data

【问题讨论】:

  • 那么问题是什么?

标签: python pandas time-series pandas-groupby


【解决方案1】:

使用DataFrame.groupby创建单独的数据框

groups=( df.index.to_series().diff()>=pd.Timedelta(seconds=6) ).cumsum()+1
for i , group in df.groupby(groups):
    print(group)

                     data
datetime                 
2018-01-01 00:00:00   4.2
2018-01-01 00:00:06   4.1
2018-01-01 00:00:18   3.4
2018-01-01 00:00:24   4.7
                     data
datetime                 
2018-01-01 00:00:54   3.3
2018-01-01 00:01:00   8.2

详情

print(groups)

datetime
2018-01-01 00:00:00    1
2018-01-01 00:00:06    1
2018-01-01 00:00:18    1
2018-01-01 00:00:24    1
2018-01-01 00:00:54    2
2018-01-01 00:01:00    2
Name: datetime, dtype: int64

要分析不同的数据框,您可以将它们保存在字典中:

dfs={i:group for i,group in df.groupby(groups)}
print(dfs[1])
                     data
datetime                 
2018-01-01 00:00:00   4.2
2018-01-01 00:00:06   4.1
2018-01-01 00:00:18   3.4
2018-01-01 00:00:24   4.7

print(dfs[2])
                     data
datetime                 
2018-01-01 00:00:54   3.3
2018-01-01 00:01:00   8.2

【讨论】:

  • 非常感谢您的回复,但我在示例中犯了一个小的误导性错误。我错过了一行,我只是添加了它,因为我正在寻找任何大于采样周期的洞。您的回复仍然是完美的,但是,我邀请您将 timedelta 比较编辑为 > 6 秒。
  • 不客气!你的意思是:groups=( df.index.to_series().diff()>=pd.Timedelta(seconds=6) ).cumsum()+1
  • 是但groups=( df.index.to_series().diff()>pd.Timedelta(seconds=6) ).cumsum()+1 否则everysteps 是一个新组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多