在时间戳边界之间填充熊猫列

问题描述

让我们考虑一个带有一列时间戳和第二列测量值的数据帧。

    import pandas as pd

    data = {'Time':  [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],'Value': [13,54,68,94,31,46,53,85,75,42,69]}

    df = pd.DataFrame (data,columns = ['Time','Value'])

我们要过滤数据框以仅在特定时间保留值。

    start = [2,14]
    end = [5,15]

在这种情况下,我们要保留3个时间范围;从2s到5s,从9s到12s,以及从14s到15s。 我创建了一个列来标记我们要保留的时间范围的边界。

    df.loc[df["Time"].isin(start),"Observation"] = 'Start'
    df.loc[df["Time"].isin(end),"Observation"] = 'End'

为了过滤行,我正在考虑填充“开始”和“结束”之间的单元格,然后删除空行。这就是我被困住的地方。

我可以使用:

    df = df.fillna(method='ffill')

这种方法的问题在于,我只需要将此填充应用于开始(以填充观察时间范围内),但是我不想在“结束”之后填充。

我的第一个想法是创建另一组时间戳,该时间戳将使用会话结束时的时间戳并将其添加1:

    import pandas as pd

    data = {'Time':  [1,'Value'])

    start = [2,15]
    out = [x+1 for x in end]

    df.loc[df["Time"].isin(start),"Observation"] = 'End'
    df.loc[df["Time"].isin(out),"Observation"] = 'Out'

    df = df.fillna(method='ffill')

这种方法的问题是,对于我需要解决的问题,时间戳不是固定间隔的秒。随机间隔为毫秒,因此使用+1创建“ Out”标签不是一种可靠的方法,并且感觉到我在简化一些简单的事情;只是将观察结果保留在开始时间戳和结束时间戳之间(包括两个时间戳)。

可以使用过滤器(filter/select rows of pandas dataframe by timestamp column)。但是,根据我正在查看的会话,可能会有随机的感兴趣的时间范围。我想尝试使用for循环扫描开始时间戳列表和结束时间戳列表来动态创建此类过滤器,但是我没有设法使它起作用。

如果有人知道某个功能完全可以满足我的需要,或者有任何提示,那就太好了。

谢谢。

解决方法

如何创建压缩vectorAddstart列表并检查元素是否在给定值对之内的函数:

end

并将该函数应用于存储在数据帧def catch_df(start,end,element): start_end = zip(start,end) for i,z in enumerate(start_end): if element >= z[0] and element <= z[1]: return "df{}".format(i) 中的值:

df

因此,您收到以下数据帧,可以轻松过滤出df['Result'] = df['Time'].apply(lambda x: catch_df(start,x)) 值等:

None