""" 日期工具模块 """ from datetime import date, datetime, timedelta from typing import List, Optional def parse_date(date_str: str) -> date: """解析日期字符串 (YYYYMMDD 或 YYYY-MM-DD)""" if len(date_str) == 8: return datetime.strptime(date_str, "%Y%m%d").date() elif len(date_str) == 10: return datetime.strptime(date_str, "%Y-%m-%d").date() else: raise ValueError(f"无效的日期格式: {date_str}") def format_date(d: date, format_str: str = "%Y-%m-%d") -> str: """格式化日期""" return d.strftime(format_str) def format_datetime(dt: datetime, format_str: str = "%Y-%m-%d %H:%M:%S") -> str: """格式化日期时间""" return dt.strftime(format_str) def get_market_from_code(code: str) -> str: """从代码获取市场""" if code.endswith(".SH"): return "SH" elif code.endswith(".SZ"): return "SZ" elif code.endswith(".BJ"): return "BJ" elif code.endswith(".CFE"): return "CFE" else: return "SH" # 默认上海 def get_trading_days_between( start_date: date, end_date: date, calendar: Optional[List[date]] = None ) -> List[date]: """获取两个日期之间的交易日列表""" if calendar: return [d for d in calendar if start_date <= d <= end_date] # 如果没有提供交易日历,简单排除周末 trading_days = [] current = start_date while current <= end_date: if current.weekday() < 5: # 周一到周五 trading_days.append(current) current += timedelta(days=1) return trading_days def get_default_date_range(days: int = 365) -> tuple: """获取默认日期范围""" end_date = date.today() start_date = end_date - timedelta(days=days) return start_date, end_date def int_to_date(date_int: int) -> date: """将整数日期(YYYYMMDD)转换为date对象""" return datetime.strptime(str(date_int), "%Y%m%d").date() def date_to_int(d: date) -> int: """将date对象转换为整数日期(YYYYMMDD)""" return int(d.strftime("%Y%m%d"))