【发布时间】:2021-02-13 16:54:16
【问题描述】:
让我们考虑一个带有时间戳列和第二列测量值的数据框。
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,68,46,46,31,53,54,85,75,42,69]}
df = pd.DataFrame (data, columns = ['Time','Value'])
我们希望过滤数据帧以仅保留特定时间的值。
start = [2, 9, 14]
end = [5, 12, 15]
在这种情况下,我们想要保留 3 个时间范围;从 2 秒到 5 秒,从 9 秒到 12 秒,从 14 秒到 15 秒。 我创建了一个列来标记我们想要保留的时间范围的边界。
df.loc[df["Time"].isin(start), "Observation"] = 'Start'
df.loc[df["Time"].isin(end), "Observation"] = 'End'
为了过滤行,我正在考虑填充 Start 和 End 之间的单元格,并删除空行。这就是我卡住的地方。
我尝试过使用:
df = df.fillna(method='ffill')
这种方法的问题是我只需要在开始时应用此填充(以填充观察时间范围的内部),但我不想在“结束”之后填充。
我的第一个想法是创建另一组时间戳,它将获取会话结束的时间戳并将其加 1:
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,68,46,46,31,53,54,85,75,42,69]}
df = pd.DataFrame (data, columns = ['Time','Value'])
start = [2, 9, 14]
end = [5, 12, 15]
out = [x+1 for x in end]
df.loc[df["Time"].isin(start), "Observation"] = 'Start'
df.loc[df["Time"].isin(end), "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 循环扫描开始时间戳列表和结束时间戳列表来动态创建这样的过滤器,但我没有设法让它工作。
如果有人知道一个功能完全符合我的需要,或者有任何提示,那就太好了。
谢谢。
【问题讨论】:
标签: python pandas autocomplete sections