resample() 报错因索引非 datetimeindex/timedeltaindex/periodindex;需检查并转换索引类型,正确设置 rule 与 agg,注意时区、空组处理及 downsample/upsample 差异。

resample() 为什么报错“Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex”
根本原因:输入 DataFrame 或 Series 没有时间索引,或者索引类型不是 DatetimeIndex、TimedeltaIndex 或 PeriodIndex。常见于读取 CSV 后忘记设索引,或索引是字符串但未转为时间类型。
- 先检查:
df.index看类型;df.index.dtype看是否为datetime64[ns] - 如果索引是时间列但没设为索引,用
df.set_index('time_col', inplace=True) - 如果索引是字符串(如
'2023-01-01'),必须先转换:df.index = pd.to_datetime(df.index),否则resample()直接失败 - 注意:
pd.to_datetime()遇到无法解析的值默认转成NaT,会污染重采样结果,建议加errors='coerce'并后续检查缺失
如何选对 resample 的 rule 和 agg 方法
rule 决定分组粒度(比如 '1H' 表示按小时),agg 决定每组怎么聚合。选错会导致数据被错误压缩或丢失语义。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 常用
rule:秒级用'1S',分钟级用'5T'(T是 minute 的缩写),小时用'1H',天用'1D';避免用'M'(月末)而不用'MS'(月初),时区敏感场景务必用带时区的频率如'1H'+tz_localize() - 聚合方法不能一概用
mean():高频传感器数据常需first()或last()保原始采样点;金融 OHLC 数据必须用agg({'open': 'first', 'high': 'max', 'low': 'min', 'close': 'last', 'volume': 'sum'}) - 空组默认被丢弃,如某小时无数据就不出行;需要保留用
resample(...).asfreq(),再配合fillna()
downsample 和 upsample 的性能与边界行为差异
降频(如 1s → 1min)是典型 resample 场景;升频(如 1min → 1s)本质是插值,行为完全不同,容易误用。
- 降频默认左闭右开区间(
closed='left'),即'2023-01-01 00:00'到'2023-01-01 00:01'不含后者;想包含右端点改closed='right',同时可能需调label='right'控制输出时间戳位置 - 升频必须搭配
ffill()、bfill()或interpolate(),单独resample('1S').asfreq()只填NaN;注意线性插值不适用于突变信号(如开关量) - 大数据量下,
resample是 groupby 的封装,性能瓶颈常在聚合函数本身;避免在apply()里写复杂逻辑,优先用内置方法如mean()、std()
时区感知数据 resample 的三个关键动作
带时区的时间序列重采样,漏掉任一环节都会导致时间偏移或聚合错位。
- 原始数据必须带时区:用
df.index.tz_localize('Asia/Shanghai')(本地时间转时区)或df.index.tz_convert('UTC')(转换时区),不能只靠字符串命名 -
resample()前确保索引已时区归一化,否则跨夏令时等场景会出错;例如 UTC 时间转北京时间,先tz_convert('Asia/Shanghai')再resample('1D') - 聚合后若需导出,记得用
tz_localize(None)去时区(如存 CSV),否则某些下游系统(如 Excel)无法识别
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










