如何用Pandas按非均匀时间间隔筛选DataFrame数据?
实现非均匀间隔的DataFrame数据筛选
可以实现这种自定义的非均匀间隔筛选,Pandas虽然没有直接对应内置函数,但通过结合布尔索引和循环查找就能完成需求。以下是具体实现代码和逻辑:
步骤1:构造示例DataFrame
先还原你的原始数据:
import pandas as pd data = { 'Timestamp': [0.00, 0.94, 1.94, 3.00, 4.00, 5.94, 8.00, 9.00, 10.00], 'MeasureA': [26.46, 26.52, 30.01, 30.19, 30.07, 30.02, 30.22, 30.00, 30.00], 'MeasureB': [63.60, 78.87, 82.04, 82.00, 81.43, 82.46, 82.48, 82.21, 82.34], 'MeasureC': [3.90, 1.58, 1.13, 1.17, 1.13, 1.05, 0.98, 1.13, 1.12], 'MeasureD': [0.67, 0.42, 0.46, 0.36, 0.42, 0.34, 0.35, 0.33, 0.34] } df = pd.DataFrame(data)
步骤2:实现非均匀间隔筛选逻辑
# 定义循环使用的间隔数组 intervals = [1.0, 1.5] # 初始化结果列表,默认包含第一行数据 selected_rows = [df.iloc[0]] # 初始时间阈值:第一行时间 + 第一个间隔 current_threshold = df.iloc[0]['Timestamp'] + intervals[0] # 间隔数组的当前索引(从1开始,因为第一个间隔已使用) interval_idx = 1 # 下次查找的起始位置 start_pos = 1 while start_pos < len(df): # 筛选出时间大于等于当前阈值的行,从start_pos开始查找 valid_mask = df['Timestamp'] >= current_threshold valid_candidates = df.loc[valid_mask].iloc[start_pos - df.loc[valid_mask].index[0]:] if not valid_candidates.empty: # 取第一个符合条件的行 selected_row = valid_candidates.iloc[0] selected_rows.append(selected_row) # 更新下一个时间阈值:当前行时间 + 循环取间隔数组的下一个元素 current_threshold = selected_row['Timestamp'] + intervals[interval_idx % len(intervals)] # 更新下次查找的起始位置为当前行的下一行 start_pos = df.index.get_loc(selected_row.name) + 1 # 间隔数组索引自增 interval_idx += 1 else: # 没有符合条件的行,终止循环 break # 将结果转为DataFrame并重置索引 result_df = pd.DataFrame(selected_rows).reset_index(drop=True) print(result_df)
代码逻辑说明
- 先将第一行数据加入结果集合,计算第一个时间阈值(
0.00 + 1.0 = 1.0),从第二行开始查找第一个时间≥1.0的行(即Timestamp=1.94的行)。 - 接着使用间隔数组的下一个元素
1.5,计算新阈值1.94 + 1.5 = 3.44,找到第一个时间≥3.44的行(即Timestamp=4.00的行)。 - 之后循环复用间隔数组:用
1.0计算阈值4.00+1.0=5.00,找到5.94的行;再用1.5计算阈值5.94+1.5=7.44,找到8.00的行;继续用1.0计算阈值8.00+1.0=9.00,找到9.00的行;最后阈值9.00+1.5=10.50,无符合条件的行,循环终止。 - 最终得到的结果与你期望的筛选结果一致(注:你提供的期望结果中
5.94行的MeasureB值为82.33,应为笔误,代码会保留原始数据的82.46)。
内容的提问来源于stack exchange,提问作者Jacobo
相关产品推荐
相关产品推荐

