# -*- coding: utf-8 -*- """dbbardata 日线 datetime 归一化 helper (双行根治方案A)。 背景: dbbardata (DbBarData) UNIQUE(symbol,exchange,interval,datetime) 按字符串字面比较。 历史多写入路径混用 "YYYY-MM-DD" 与 "YYYY-MM-DD 00:00:00" 两种格式, 同一交易日 INSERT OR REPLACE 不去重 -> 双行, 致回测翻倍/pivot duplicate。 归一规则: 日线 (interval='d') 写入前必调 normalize_daily_dt, 统一为纯日期 'YYYY-MM-DD'。 分钟 (interval='15m' 等) 不要调 — 分钟必须带时分。 入口: 所有写 dbbardata interval='d' 的脚本 import 并在 datetime 列写入前调用。 """ from typing import Optional def normalize_daily_dt(s: Optional[str]) -> Optional[str]: """日线 datetime 归一为纯日期 'YYYY-MM-DD' (取前 10 字符)。 - 纯日期 'YYYY-MM-DD' -> no-op - 'YYYY-MM-DD 00:00:00' / 'YYYY-MM-DD HH:MM:SS' -> 截断为 'YYYY-MM-DD' - None -> None (保留语义不崩溃) - 短串/空串 -> 原样返回(前 10 字符)不崩溃 """ if s is None: return None return str(s)[:10]