You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataFrame移除时间戳间隔小于5秒数据行报错求助

处理DataFrame中时间戳过近的过采样问题

问题描述

数据集内大量数据点时间戳过于接近,引发过采样问题。需要对DataFrame进行处理:保留每个时间戳区间的首行,删除该首行时间戳前后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 (most recent call last)
/local/home/python3.7/site-packages/pandas/core/indexes/range.py in get_loc(self, key, method, tolerance)
354                 try:
--> 355                     return self._range.index(new_key)
356                 except ValueError as err:

ValueError: 235 is not in range

示例DataFrame

index timestamp        value
0   1675434673166538783 14.62
1   1675434684419325010 14.62
2   1675434684420505291 14.62
3   1675434673164456809 14.63
4   1675434700772654637 14.50

错误原因

原代码在循环中持续修改并重置test_df的索引,而循环的i值基于初始DataFrame的长度。当test_df被过滤变短后,后续的i值会超出新DataFrame的索引范围,触发ValueError。

解决方案

采用指针遍历筛选的方式,避免在循环中修改原DataFrame,确保索引始终有效:

import pandas as pd

# 1. 先按时间戳排序,重置索引
test_df = test_df.sort_values(by='timestamp').reset_index(drop=True)

# 2. 初始化保留的索引和最后一个保留的时间戳
keep_indices = [0]
last_kept_ts = test_df['timestamp'].iloc[0]

# 3. 定义5秒对应的纳秒数(匹配原代码的时间戳单位逻辑)
FIVE_SECONDS_NS = 5 * 10**9

# 4. 遍历后续行,筛选符合间隔要求的数据
for i in range(1, len(test_df)):
    current_ts = test_df['timestamp'].iloc[i]
    if current_ts - last_kept_ts >= FIVE_SECONDS_NS:
        keep_indices.append(i)
        last_kept_ts = current_ts

# 5. 生成最终筛选后的DataFrame
filtered_df = test_df.loc[keep_indices].reset_index(drop=True)

代码说明

  • 先对时间戳排序,保证遍历顺序正确
  • 维护一个保留索引列表,仅当当前行时间戳与最后一个保留行的时间戳差≥5秒时,才将其加入列表
  • 最后通过保留索引筛选数据,避免循环中修改原DataFrame导致的索引异常

示例处理结果

对提供的示例DataFrame处理后,得到的结果如下:

timestamp        value
1675434673164456809 14.63
1675434684419325010 14.62
1675434700772654637 14.50

内容的提问来源于stack exchange,提问作者Bag

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:57:22