
本文介绍如何使用 pandas 对带有不规则时间戳的小时级气象数据进行重采样,通过先升频插值再降频对齐,精准生成每小时整点(如 15:00、16:00)的线性插值温度值。
在实际时间序列分析中,传感器数据常以近似但不精确的时间间隔采集(例如每小时 51 分记录),而下游任务(如可视化、建模或与标准气象产品对齐)往往要求严格对齐到整点(如 15:00, 16:00)。直接使用 df.resample('H').first().interpolate('linear') 并不能达到预期效果——因为 .first() 会丢失原始时间信息,导致插值失去时序依据;而 .interpolate() 在降频后应用,已无足够密度支撑准确线性拟合。
正确策略是 “升频→插值→降频”三步法:
- 升频(Upsample):将原始数据重采样至高频率(如分钟级 'T' 或 '1min'),用 .first() 获取每个分钟桶内的首个观测值(此时多数分钟为空,产生大量 NaN);
- 插值(Interpolate):在密集的时间索引上执行 interpolate(method='linear'),利用原始时间戳的精确位置进行等距线性插值;
- 降频(Downsample):再以小时为单位重采样('H'),并用 .asfreq() 直接提取整点时刻的值(而非聚合),确保结果严格落在 HH:00:00。
以下是完整可运行示例:
import pandas as pd
# 构造示例数据(注意:时间列需转为 datetime 并设为索引)
data = {
'Date Time, GMT-08:00': ['10/31/23 15:51', '10/31/23 16:51',
'10/31/23 17:51', '10/31/23 18:51',
'10/31/23 19:51', '10/31/23 20:51',
'10/31/23 21:51'],
'Temp, °C': [13.41, 7.49, 7.61, 7.39, 7.34, 7.33, 7.38]
}
df = pd.DataFrame(data)
# 关键预处理:解析时间、设为索引
df['Date Time, GMT-08:00'] = pd.to_datetime(
df['Date Time, GMT-08:00'],
format='%m/%d/%y %H:%M'
)
df = df.set_index('Date Time, GMT-08:00')
# ✅ 正确流程:升频 → 插值 → 降频 → 取频点
result = (df
.resample('T').first() # 升频至分钟级,保留原始观测点
.interpolate(method='linear') # 在连续分钟索引上线性插值
.resample('H').asfreq()) # 降频至小时级,取每小时首分钟(即 HH:00:00)
print(result)输出结果:
Temp, °C Date Time, GMT-08:00 2023-10-31 15:00:00 NaN 2023-10-31 16:00:00 12.5220 2023-10-31 17:00:00 7.5080 2023-10-31 18:00:00 7.5770 2023-10-31 19:00:00 7.3825 2023-10-31 20:00:00 7.3385 2023-10-31 21:00:00 7.3375
⚠️ 注意事项:首行 15:00 为 NaN,因原始最早数据在 15:51,无法向前提取整点值(可结合 limit_direction='forward' 或 fill_value 处理边界);若原始时间跨度大、精度要求高,可改用 'S'(秒级)升频提升插值平滑度;.asfreq() 保证输出严格对齐整点;若需聚合(如取均值),应改用 .mean(),但会损失插值意义;所有操作均基于索引的时间语义,务必确保 datetime 索引已正确设置且无时区歧义(必要时用 .dt.tz_localize() / .dt.tz_convert() 统一时区)。
该方法兼顾物理合理性与工程实用性,是处理非均匀采样气象、IoT 或金融时间序列的标准实践。










