在定义的时间内查找序列中最频繁出现的范围(在Pandas中)

时间:2017-08-27 20:53:31

标签: python pandas

我在Pandas中有一个大型数据集,其中的条目标有时间戳。我正在寻找一个解决方案,如何获得具有最高条目的定义长度(如1分钟)的范围。

一种解决方案可能是将数据重新采样到更高的时间范围(例如一分钟),并将这些部分与最大数量的值进行比较。但是,它只会找到与给定时间帧的开始和结束时间相对应的范围。

我宁愿找到一个解决方案来找到任何1分钟的范围,无论它们实际上从哪里开始。

在下面的示例中,我将查找1分钟的“窗口”,其中条目的最高出现次数以范围中的第一个信号开头,并以范围中的最后一个信号结束:

8:50:00
8:50:01
8:50:03
8:55:00
8:59:10
9:00:01
9:00:02
9:00:03
9:00:04
9:05:00

因此我想得到范围8:59:10 - 9:00:04

任何提示如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

您需要创建1分钟的窗口,滑动开始时间为1秒;计算任何窗口的最大出现次数。在pandas 0.19.0或更高版本中,您可以使用base作为参数重新采样时间序列,以便在不同时间启动重新采样的窗口。

我使用tempfile将您的数据复制为下面的玩具数据集。

import tempfile
import pandas as pd

tf = tempfile.TemporaryFile()
tf.write(b'''8:50:00
8:50:01
8:50:03
8:55:00
8:59:10
9:00:01
9:00:02
9:00:03
9:00:04
9:05:00''')
tf.seek(0)

df = pd.read_table(tf, header=None)
df.columns = ['time']
df.time = pd.to_datetime(df.time)

max_vals = []
for t in range(60):
    # .max().max() is not a mistake, use it to return just the value
    max_vals.append(
        (t, df.resample('60s', on='time', base=t).count().max().max())
    )

max(max_vals, key=lambda x: x[-1])
# returns:
(5, 5)

对于这个玩具数据集,窗口的偏移量为5秒(即8:49:05,8:50:05,......)具有1分钟窗口的最大计数的第一个,有5个计数。