如何从非固定步长时序温度数据生成5分钟固定步长插值结果
温度数据对齐到5分钟间隔的插值实现
步骤1:读取并预处理原始数据
先把原始文本数据转换成pandas可处理的格式,解析时间并提取温度值:
import pandas as pd import numpy as np # 替换成你的数据文件路径 df_raw = pd.read_csv('temp_data.txt', sep='[: ]+', engine='python', names=['datetime', 'unused', 'temperature'], usecols=[0, 3]) # 按照原始时间格式解析 df_raw['datetime'] = pd.to_datetime(df_raw['datetime'], format='%d.%m.%Y %H:%M:%S') # 设置时间为索引,只保留温度列 df_raw = df_raw.set_index('datetime')['temperature']
步骤2:用np.interp完成插值
核心是把时间转换为数值型时间戳,因为np.interp仅支持数值输入。结合你已经生成的5分钟间隔时间序列:
# 假设你已经定义了beginTime和endTime,生成目标时间序列 times = pd.date_range(beginTime, endTime, freq='5min') # 转换时间为Unix时间戳(秒级整数) raw_timestamps = df_raw.index.astype('int64') // 10**9 target_timestamps = times.astype('int64') // 10**9 # 线性插值 interp_temp = np.interp(target_timestamps, raw_timestamps, df_raw.values) # 封装成结果DataFrame result_df = pd.DataFrame({ 'datetime': times, 'interpolated_temperature': interp_temp }).set_index('datetime')
可选:更高阶的插值方式
如果需要非线性插值(比如三次样条),可以用scipy的插值函数:
from scipy.interpolate import interp1d # 创建三次样条插值函数 interp_func = interp1d(raw_timestamps, df_raw.values, kind='cubic') # 生成插值结果 cubic_interp_temp = interp_func(target_timestamps) # 同样封装成DataFrame result_df_cubic = pd.DataFrame({ 'datetime': times, 'cubic_interpolated_temperature': cubic_interp_temp }).set_index('datetime')
注意事项
- 确保
beginTime和endTime覆盖原始数据的时间区间,超出范围的部分np.interp会用首尾的温度值填充(常量外推) - 如果原始数据存在缺失值,先执行
df_raw = df_raw.dropna()清理无效数据
内容的提问来源于stack exchange,提问作者monok
相关产品推荐
相关产品推荐

