|
|
|
@ -83,6 +83,7 @@ def _parse_stocks(raw: str) -> tuple[list[str], Optional[dict[str, str]]]: |
|
|
|
def _df_to_json_payload(df: pd.DataFrame) -> dict: |
|
|
|
def _df_to_json_payload(df: pd.DataFrame) -> dict: |
|
|
|
"""DataFrame -> JSON-safe dict.""" |
|
|
|
"""DataFrame -> JSON-safe dict.""" |
|
|
|
import math |
|
|
|
import math |
|
|
|
|
|
|
|
import re |
|
|
|
safe = df.copy() |
|
|
|
safe = df.copy() |
|
|
|
# 处理 NaN / NaT / Timestamp / inf -> None |
|
|
|
# 处理 NaN / NaT / Timestamp / inf -> None |
|
|
|
for col in safe.columns: |
|
|
|
for col in safe.columns: |
|
|
|
@ -103,6 +104,11 @@ def _df_to_json_payload(df: pd.DataFrame) -> dict: |
|
|
|
new_row[k] = None |
|
|
|
new_row[k] = None |
|
|
|
else: |
|
|
|
else: |
|
|
|
new_row[k] = v |
|
|
|
new_row[k] = v |
|
|
|
|
|
|
|
elif isinstance(v, str): |
|
|
|
|
|
|
|
# 去除 ASCII 控制字符 (除 \t \n \r 外), 防止 JSON 解析失败 |
|
|
|
|
|
|
|
# 长文本字段 (如 ORG_PROFILE) 可能含 \f \v 等非标准换行 |
|
|
|
|
|
|
|
v = re.sub(r'[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]', '', v) |
|
|
|
|
|
|
|
new_row[k] = v |
|
|
|
else: |
|
|
|
else: |
|
|
|
new_row[k] = v |
|
|
|
new_row[k] = v |
|
|
|
cleaned.append(new_row) |
|
|
|
cleaned.append(new_row) |
|
|
|
|