4. 时间序列数据重采样

任务目标

传感器采集系统常因网络抖动或事件触发产生时间间隔不规则的记录。本案例将一组不规则时间戳的原始传感器读数(CSV格式)重采样为固定1分钟频率的规则序列,输出每个分钟窗口内传感器读数的均值,并补齐无数据的时间窗口。

环境与依赖

需要 Python 3.8+,以及 pandas 和 numpy 库。安装命令:

pip install pandas numpy

输入数据

创建 sensor_raw.csv,包含两列:timestamp(ISO格式字符串)和 value(浮点数)。示例数据(时间间隔不规则,含重复秒内多条记录):

timestamp,value
2025-01-10 09:00:01,23.5
2025-01-10 09:00:03,24.1
2025-01-10 09:00:03,23.9
2025-01-10 09:01:15,25.0
2025-01-10 09:02:02,24.6
2025-01-10 09:04:30,26.2

完整实现代码

以下代码读取原始CSV,将时间戳解析为DatetimeIndex,按1分钟频率重采样并计算均值,最后保存结果:

import pandas as pd

# 读取原始数据
df = pd.read_csv('sensor_raw.csv', parse_dates=['timestamp'])
df = df.set_index('timestamp')

# 重采样为1分钟频率,取均值;无数据窗口填充NaN
df_resampled = df['value'].resample('1min').mean()

# 将结果保存为CSV(保留NaN以便区分缺失窗口)
df_resampled.to_csv('sensor_1min.csv', header=['value_mean'])

# 控制台输出查看结果
print(df_resampled)

运行方式

python resample_sensor.py

验证方法与通过条件

运行后检查输出文件 sensor_1min.csv,应满足:

  • 时间戳严格按 2025-01-10 09:00:00、09:01:00、09:02:00……递增,间隔恰好60秒;
  • 09:00窗口的值为 (23.5+24.1+23.9)/3 = 23.833(重复秒内多条记录被聚合);
  • 09:01窗口值为 25.0,09:02窗口值为 24.6;
  • 09:03窗口无原始数据,输出为 NaN(CSV中为空值);
  • 09:04窗口值为 26.2。

控制台打印的Series索引即为重采样后的分钟时间戳,数值与上述预期一致即判定通过。

关键说明

resample('1min') 默认以左闭右开窗口聚合(即09:00:00至09:00:59的数据归入09:00窗口)。若需对缺失分钟填充前值或0,可在重采样后追加 .ffill() 或 .fillna(0),但本案例保留NaN以明确标识无数据时段。