必须先将时间列设为datetimeindex再重采样:用set_index转索引,to_datetime转换类型(errors='coerce'处理非法值),再sort_index排序;补全用asfreq()而非resample().asfreq();自定义范围用reindex()配合date_range;nan需按业务含义谨慎填充。

用 resample() 前必须确保索引是 datetime 类型
直接对普通列调用 resample() 会报 TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex。Pandas 的重采样只认索引,不是任意时间列。
实操建议:
- 先用
df.set_index('time_col')把时间列设为索引 - 再用
pd.to_datetime()强制转换索引类型:df.index = pd.to_datetime(df.index) - 如果原始时间列含非法值(如空字符串、'N/A'),
pd.to_datetime(..., errors='coerce')会转成NaT,后续需用dropna()清理
补全固定频率网格:用 asfreq() 比 resample().asfreq() 更直接
resample() 是聚合操作(如求均值、计数),而补全缺失时间点本质是“按频率对齐”,asfreq() 才是语义准确的工具。
常见错误:写成 df.resample('1H').asfreq() —— 这会先按小时分组再取首值,若某小时内有多条记录,只保留第一条;且无法补全完全空缺的小时段(除非加 closed='left' 等参数,逻辑变复杂)。
正确做法:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 确保索引是
DatetimeIndex并已排序:df = df.sort_index() - 直接调用
df.asfreq('1H'),它会在最小到最大时间范围内,以 1 小时为步长生成完整索引,缺失位置填NaN - 支持频率字符串如
'5T'(5 分钟)、'1D'(日)、'MS'(月初)
补全不规则起止范围或自定义时间点:用 reindex()
当需要从特定开始时间补到特定结束时间(比如补足整月,哪怕原始数据只覆盖月中几天),或者想插入一组手工指定的时间戳时,asfreq() 不够灵活。
实操建议:
- 构造目标时间索引:
full_idx = pd.date_range(start='2024-01-01', end='2024-01-31', freq='D') - 用
df.reindex(full_idx)对齐,缺失位置自动填NaN - 若原始索引含时区(如
UTC),目标date_range也需带相同时区,否则reindex()会静默失败(返回全NaN) - 可传
method='ffill'或fill_value=0控制填充方式,但默认就是NaN
补全后处理 NaN:别直接用 fillna(0) 盖掉所有空值
时序数据中,NaN 可能代表“无观测”或“设备离线”,而 0 可能有实际物理意义(如功率为 0)。盲目填充会扭曲统计结果和后续建模。
更稳妥的做法:
- 先检查缺失模式:
df.isna().sum()看哪几列空、空多少;df.index.to_series().diff().value_counts()看时间间隔是否真均匀 - 若确认是纯缺失(非业务含义的零),再选填充策略:前向填充(
ffill)适合缓变信号,插值(interpolate())适合连续变量,但别在跨天/跨设备断点处硬插 - 保留原始缺失状态,把
NaN显式标记为missing_flag = df.isna().any(axis=1),供后续分析区分
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










