问题描述
让我们考虑一个带有一列时间戳和第二列测量值的数据帧。
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循环扫描开始时间戳列表和结束时间戳列表来动态创建此类过滤器,但是我没有设法使它起作用。
如果有人知道某个功能完全可以满足我的需要,或者有任何提示,那就太好了。
谢谢。
解决方法
如何创建压缩vectorAdd
和start
列表并检查元素是否在给定值对之内的函数:
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