问题: 我有很多数据点在时间戳方面彼此太接近,这意味着当我操纵数据时,我会过度采样。
我需要什么: 对于数据框中的每个元素,我需要删除距其 5 秒范围内的所有元素。这意味着第一行是我正在使用的行,并且需要删除 5 秒内的后续行。这就是我现在拥有的:
test_df = test_df.sort_values(by='timestamp').reset_index(drop=True)
for i in range(0, len(test_df)):
currentTimestamp = test_df.timestamp.loc[i]
temp_row = test_df.loc[i]
temp_5_secs = add_ms(currentTimestamp, 5000)
test_df = test_df[(test_df.timestamp) >= temp_5_secs].reset_index(drop=True)
test_df = test_df.append(temp_row, ignore_index=True)
test_df = test_df.sort_values(by='timestamp').reset_index(drop=True)
def add_ms(timestamp, ms):
return int(timestamp) + 1000000* ms
ValueError Traceback(最近一次调用最后一次) /local/home/python3.7/site-packages/pandas/core/indexes/range.py in get_loc(self, key, method,lerance) 第354章 --> 355 返回 self._range.index(new_key) 第356章
值错误:235 不在范围内这是一个示例数据框:
index timestamp value
0 1675434673166538783 14.62
1 1675434684419325010 14.62
2 1675434684420505291 14.62
3 1675434673164456809 14.63
4 1675434700772654637 14.50
总结,对于数据帧中的每个时间戳元素,删除距该元素 5 秒范围内的后续元素。通过删除行来删除。对每个元素执行此操作,以便我们知道结果将是不存在时间戳彼此小于 5 秒的行。提前致谢!
给定样本 df。
def mask_stamp(k: list, time_incr: int)-> list[bool]:
# return a list of bool values where True implies drop row
last_time = 0
delta_t = time_incr * 1000000000
rslt = []
for tstmp in k:
if tstmp > last_time:
rslt.append(False)
last_time = tstmp + delta_t
else:
rslt.append(True)
return rslt
def filter_timestamps(dfx: pd.DataFrame, time_inc:int)-> None:
# return df with timestamps filtered by time increment
drp_list = mask_stamp(dfx['timestamp'].to_list(), time_inc)
for i in range(len(drp_list)):
if drp_list[i]:
dfx.drop(index= i, inplace= True)
然后执行以下操作:
df.sort_values(by=['timestamp'], ignore_index=True, inplace=True)
filter_timestamps(df, 5)
这产生:
timestamp value
0 1675434673164456809 14.63
2 1675434684419325010 14.62
4 1675434700772654637 14.50