基于时间戳条件合并DataFrame中多传感器数据的高效方案求解
Pandas按时间戳条件合并多传感器数据的高效实现方案
核心实现逻辑为摒弃逐行遍历方案,使用Pandas/Numpy原生向量化操作完成,针对十万行以上的数据集,性能提升可达数百到数千倍。
方案1:单切分点场景使用numpy.where实现
针对你当前的使用场景,这是最简实现方案:
import pandas as pd import numpy as np # 原有示例数据 idx = pd.date_range("2018-01-01", periods=6, freq="H") df = pd.DataFrame(data={ 'sensor 1' :[5.4,5,5.2,3,2,2], 'sensor 2' : [-1,-2,-3,5.5,5.4,5.6]}, index=idx) # 定义时间切分点 split_time = pd.Timestamp('2018-01-01 03:00:00') # 一行代码生成结果 df['sensor'] = np.where(df.index < split_time, df['sensor 1'], df['sensor 2']) result = df[['sensor']]
运行后得到的result和你预期的输出完全一致。
方案2:使用loc分段赋值
如果逻辑更复杂、存在多个前置过滤条件,可以用loc分段赋值,可读性更高:
split_time = pd.Timestamp('2018-01-01 03:00:00') # 先默认赋值传感器1的数值 df['sensor'] = df['sensor 1'] # 满足时间条件的行替换为传感器2的数值 df.loc[df.index >= split_time, 'sensor'] = df.loc[df.index >= split_time, 'sensor 2'] result = df[['sensor']]
多切分点/多传感器扩展方案
如果后续需要对接更多传感器、配置多个时间切换点,可以用pd.cut批量打标签后取值,不需要新增多个判断分支:
# 示例:3个传感器对应3个时间区间 bins = [ pd.Timestamp('2018-01-01 00:00:00'), pd.Timestamp('2018-01-01 03:00:00'), pd.Timestamp('2018-01-01 06:00:00'), pd.Timestamp('2018-01-02 00:00:00') ] # 每个时间区间对应的传感器列名 labels = ['sensor 1', 'sensor 2', 'sensor 3'] # 给每行打标签,标记该行应该取哪个传感器的值 df['use_sensor'] = pd.cut(df.index, bins=bins, labels=labels, right=False) # 按标签取对应列的值 df['sensor'] = df.lookup(df.index, df['use_sensor'])
内容的提问来源于stack exchange,提问作者Thomas LESIEUR
相关产品推荐
相关产品推荐

