如何将不规则5分钟间隔气象数据重采样为小时数据?
气象观测数据集
| Date | Time | Temperature_C | Wind speed_kmph | Precipitation Rate_mm | Pressure_hPa |
|---|---|---|---|---|---|
| 1/1/2017 | 23:00:00 | 7.72 | 1.61 | 0 | 1023.37 |
| 1/1/2017 | 23:05:00 | 7.61 | 0 | 0.51 | 1023.71 |
| 1/1/2017 | 23:10:00 | 7.72 | 1.61 | 0 | 1023.37 |
| 1/1/2017 | 23:15:00 | 7.61 | 0 | 0 | 1023.71 |
| 1/1/2017 | 23:20:00 | 7.72 | 1.61 | 0.25 | 1023.37 |
| 1/1/2017 | 23:25:00 | 7.61 | 0 | 0 | 1023.71 |
| 1/1/2017 | 23:30:00 | 7.72 | 1.61 | 0.51 | 1023.37 |
| 1/1/2017 | 23:35:00 | 7.61 | 0 | 0 | 1023.71 |
| 1/1/2017 | 23:40:00 | 7.72 | 1.61 | 0.25 | 1023.37 |
| 1/1/2017 | 23:45:00 | 7.61 | 0 | 0 | 1023.71 |
| 1/1/2017 | 23:50:00 | 7.72 | 1.61 | 0 | 1023.37 |
| 1/1/2017 | 23:55:00 | 7.61 | 0 | 0 | 1023.71 |
| 1/2/2017 | 00:03:00 | 7.72 | 1.61 | 0.51 | 1023.37 |
| 1/2/2017 | 00:08:00 | 7.61 | 0 | 0 | 1023.71 |
| 1/2/2017 | 00:13:00 | 7.72 | 1.61 | 0 | 1023.37 |
| 1/2/2017 | 00:18:00 | 7.61 | 0 | 0.25 | 1023.71 |
数据时间序列不规整:2017年1月2日00:00:00因记录仪故障无数据,故障修复后从当日00:03:00恢复记录。此外,数据还存在间隔超过5分钟的情况(例如2017年1月3日00:05:00记录后,下一条记录为00:17:00,有时故障甚至无法当日修复)。需要将数据重采样为小时间隔数据(比如5分钟间隔)。
重采样规整时间序列的解决方案
用Python的pandas库可以高效处理这类问题,以下是具体流程:
1. 读取并预处理数据
将数据加载后,合并日期和时间列生成完整时间戳,并设置为索引:
import pandas as pd # 读取数据(假设数据存储在csv文件,也可直接用列表构造DataFrame) df = pd.read_csv('weather_data.csv') # 合并日期与时间,转换为datetime类型 df['datetime'] = pd.to_datetime(df['Date'] + ' ' + df['Time']) # 设置时间戳为索引,删除原日期、时间列 df = df.set_index('datetime').drop(['Date', 'Time'], axis=1)
2. 生成目标规整时间序列
根据需要的小时间隔(以5分钟为例),创建覆盖原始数据时间范围的连续时间轴:
# 获取数据的起始和结束时间,生成5分钟间隔的连续时间索引 start_time = df.index.min().floor('5min') end_time = df.index.max().ceil('5min') target_index = pd.date_range(start=start_time, end=end_time, freq='5min')
3. 对齐原始数据到目标时间轴
将原始数据重新索引到目标时间序列,缺失位置用NaN占位:
df_resampled = df.reindex(target_index)
4. 填充缺失值
根据气象参数的特性选择合适的填充方式:
- 温度、气压:连续变化的参数,用线性插值保证数据平滑性
- 风速:用前向填充保留最后一次观测值,直到下一次有有效数据
- 降水量:无记录时段通常填充0(若确认是故障导致缺失,可标记后再处理)
示例代码:
# 温度、气压采用线性插值 df_resampled[['Temperature_C', 'Pressure_hPa']] = df_resampled[['Temperature_C', 'Pressure_hPa']].interpolate(method='linear') # 风速用前向填充 df_resampled['Wind speed_kmph'] = df_resampled['Wind speed_kmph'].ffill() # 降水量缺失值填充0 df_resampled['Precipitation Rate_mm'] = df_resampled['Precipitation Rate_mm'].fillna(0)
5. 处理长时间缺失
若遇到几小时以上的故障缺失:
- 直接保留
NaN,避免插值引入错误 - 标记缺失时段,后续分析时排除
- 结合同期历史数据填充(如有)
6. 验证结果
检查重采样后的数据是否符合预期:
print(df_resampled.head(20))
内容的提问来源于stack exchange,提问作者Amisha Dhimal
相关产品推荐
相关产品推荐

