阶段4Python 基础进阶●●●●●

datetime处理:量化代码的第一口"时间基准"锅

我的掌握程度:
q-319精讲

先掌握这个答案

pd.to_datetime:把各种格式统一为datetime64类型——支持format参数指定格式(format='%Y%m%d'可解析"20240115")。两大坑:①格式猜错(日/月混淆——01/02是1月2日还是2月1日?——用dayfirst或format显式指定);②时区(UTC vs 北京时间——跨市场必须统一)。set_index后的操作:切片df['2020':'2024']按年、df['2024-01']按月;resample('W')周频重采样;rolling(20)自动按行(不按天数——纯交易日计数)。日期差:df.index.to_series().diff().dt.days——注意节假日会出4-7天(不是1天)——交易日对齐要用交易日历(q-068)。

先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。

从理解到使用

本阶段实战方法 · 一条能复现的数据流水线

把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。

  1. 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
  2. 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
  3. 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。

使用边界

  • 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
  • API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
背景 · 从一个困惑说起
Excel里的"2024-01-15"、API返回的"20240115"、akshare的"2024-01-15 00:00:00"——同一个日期在不同来源长得不一样。datetime处理的第一件事:统一格式。第二件事:把日期设为索引——解锁pandas的全部时序魔法。
由此产生的问题
pd.to_datetime的核心用法与常见坑(格式/时区)?set_index('date')后解锁哪些操作(切片/resample/rolling)?日期差和交易日历的注意点?
核心概念
pd.to_datetime:把各种格式统一为datetime64类型——支持format参数指定格式(format='%Y%m%d'可解析"20240115")。两大坑:①格式猜错(日/月混淆——01/02是1月2日还是2月1日?——用dayfirst或format显式指定);②时区(UTC vs 北京时间——跨市场必须统一)。set_index后的操作:切片df['2020':'2024']按年、df['2024-01']按月;resample('W')周频重采样;rolling(20)自动按行(不按天数——纯交易日计数)。日期差:df.index.to_series().diff().dt.days——注意节假日会出4-7天(不是1天)——交易日对齐要用交易日历(q-068)。
为什么需要它
①时间轴是量化数据的脊柱:所有面板操作(分组/窗口/切片)都依赖正确的datetime索引;②格式统一是第一步工程:多源数据合并前先把所有日期统一到同一个datetime格式——否则merge会疯狂失败;③pandas的时序魔法只在datetime索引下生效——字符串索引切片不生效(或行为不一致)。
实际应用场景
标准三行:df['date']=pd.to_datetime(df['date']); df=df.set_index('date').sort_index(); df.loc['2024':]今年切片——这三行是所有面板的初始化仪式。
与之前知识的联系
q-307(loc/iloc——datetime索引下loc更安全);q-320(resample——必须先有datetime索引);q-068(交易日历——解决日历天vs交易日差异)。
⚠ 常见误解
  • 字符串日期可以直接切片:df['2024-01':'2024-03']在字符串索引下行为不一致——必须先to_datetime再set_index
  • diff()的天数=交易日:不——是日历天(周末=2天、长假=7天);算「N天前」要用shift(N)(交易日)不是日期减N天
  • 时区不需要管:单市场无所谓——A股+美股+加密混合时必须统一(通常统一UTC或统一北京时间)——错位一天=全错
  • 20240115这种整数日期pandas能自动识别:不能——必须format='%Y%m%d'显式指定

🤖 AI导师

导师会先检查你的前置知识(loc/iloc、索引概念),再用案例、公式和代码帮助理解。此功能需要先启用服务。