我在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
任何提示如何实现这一目标?
答案 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个计数。