pd.to_datetime()解析失败主因是格式不统一且默认不猜测,需显式指定format或errors='coerce';resample('M')按月末对齐而非自然月,应用'MS'或补全日期;周聚合需注意起始日与标签逻辑;链式操作须确保索引为DatetimeIndex并统一时区。

pd.to_datetime() 解析失败的常见原因和应对
时间字符串格式不统一时,pd.to_datetime() 默认会报 ParserError 或静默返回 NaT,而不是你期待的日期。这不是函数坏了,是它默认不强行猜测格式。
- 显式传
format参数最快最稳,比如'%Y-%m-%d %H:%M:%S';但只要有一个值不符合,整列就崩 - 设
errors='coerce'把错的全转成NaT,后续用.dropna()或标记处理,比中断强 - 含中文或非标准分隔符(如“2023年05月12日”)必须配
format,infer_datetime_format=True对这种无效 - Unix 时间戳(秒/毫秒整数)要加
unit:秒用unit='s',毫秒用unit='ms',否则默认当纳秒处理,结果错得离谱
resample('M') 为什么总少一个月?
resample('M') 是按“月末时刻”对齐的,不是自然月。如果你原始数据截止到 2023-05-30,它不会自动补出 2023-05 的聚合结果——因为没到 2023-05-31 这个锚点。
- 想按自然月聚合,用
resample('MS')(Month Start)更可控,再配合.agg(...)计算当月所有有效数据 - 若必须用
'M',先用.asfreq('D')或.reindex()补齐日期范围,否则空月直接消失 -
closed和label很关键:默认closed='right', label='right',意味着2023-05-31的桶包含2023-05-01到2023-05-31,但不含2023-05-31 00:00:00之前一秒——时间精度差一丁点就丢数据
按周重采样(W-MON)结果对不上日历周
Pandas 的 'W' 默认以周日为每周起点,W-MON 才是周一,但即使写了 W-MON,聚合结果的时间戳仍落在**该周的周一**,而非你直觉里的“本周一到周日”的中间点或结束点。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 检查原始索引是否已设为
DatetimeIndex:df.index = pd.DatetimeIndex(df.index),否则resample直接报错或静默失效 - 周聚合后想让标签显示为“2023-05-01 至 2023-05-07”,得手动加列:
df['week_range'] = df.index.strftime('%Y-%m-%d') + ' to ' + (df.index + pd.Timedelta(days=6)).strftime('%Y-%m-%d') - 遇到节假日或非连续交易日,
resample不跳过也不插值,只对已有数据聚合。真要对齐交易周,得先用pd.bdate_range()构建目标索引再.reindex()
to_datetime + resample 链式操作容易漏掉的坑
很多人写 df['time'].apply(pd.to_datetime).resample('M').sum(),看着顺,其实暗藏两处断裂:类型没设回索引、时区未归一。
- 转换完必须设回索引:
df.index = pd.to_datetime(df['time']),否则resample作用在默认整数索引上,毫无意义 - 混合时区(比如部分带
+08:00,部分无)会导致resample报TypeError: Cannot compare tz-naive and tz-aware datetime-like objects,统一用.dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai') - 高频数据(如秒级)按月重采样前,建议先用
.asfreq('S')显式声明频率,否则resample可能因推断不准而聚合错窗口
时间对齐这事,没有“默认就对”的路径。每一步的锚点、边界、时区、缺失值处理,都得亲手指定,不然 Pandas 就按它自己的规则默默执行——而那个规则,往往和你的业务日历不一致。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










