fix(api): 修复 JSON 序列化错误

- 支持多种日期列名(date, Date, index, trade_date, datetime)
- 添加对 Timestamp 对象的递归转换
- 修复 yfinance 返回数据中的 Timestamp 序列化问题
This commit is contained in:
2026-05-07 23:36:10 +08:00
parent be12686f13
commit 270f4fe7f4

View File

@@ -205,12 +205,29 @@ def dataframe_to_json(df: pd.DataFrame) -> Dict:
# 重置索引,将日期转为列
df_reset = df.reset_index()
# 处理日期列
if 'date' in df_reset.columns:
df_reset['date'] = df_reset['date'].dt.strftime('%Y-%m-%d')
elif 'index' in df_reset.columns:
df_reset['index'] = pd.to_datetime(df_reset['index']).dt.strftime('%Y-%m-%d')
df_reset = df_reset.rename(columns={'index': 'date'})
# 处理日期列(支持多种可能的列名)
date_columns = ['date', 'Date', 'index', 'trade_date', 'datetime']
for col in date_columns:
if col in df_reset.columns:
try:
df_reset[col] = pd.to_datetime(df_reset[col]).dt.strftime('%Y-%m-%d')
# 统一重命名为 'date'
if col != 'date':
df_reset = df_reset.rename(columns={col: 'date'})
break
except Exception:
pass
# 确保所有数据都是 JSON 可序列化的
for col in df_reset.columns:
if df_reset[col].dtype == 'object':
# 转换可能的 Timestamp 对象
try:
df_reset[col] = df_reset[col].apply(
lambda x: x.strftime('%Y-%m-%d') if hasattr(x, 'strftime') else x
)
except Exception:
pass
# 转换为字典列表
records = df_reset.to_dict(orient='records')
@@ -220,8 +237,8 @@ def dataframe_to_json(df: pd.DataFrame) -> Dict:
"count": len(records),
"columns": list(df_reset.columns),
"date_range": {
"start": df.index.min().strftime('%Y-%m-%d'),
"end": df.index.max().strftime('%Y-%m-%d'),
"start": df.index.min().strftime('%Y-%m-%d') if hasattr(df.index.min(), 'strftime') else str(df.index.min()),
"end": df.index.max().strftime('%Y-%m-%d') if hasattr(df.index.max(), 'strftime') else str(df.index.max()),
} if len(df) > 0 else None
}