MySQL查询输出的数据不干净,有各种的格式的【数据清洗方向】
评论
收藏

MySQL查询输出的数据不干净,有各种的格式的【数据清洗方向】

经验分享
早日下班
2026-04-22 13:01·浏览量:82
早日下班
影刀高级开发者
发布于 2026-04-22 12:39更新于 2026-04-22 13:0182浏览

MySQL 查询输出的数据看起来“不干净”,通常是因为影刀在执行 SQL 语句后,返回的是 Python 原生对象类型。例如,数值字段可能显示为 Decimal('10.00'),日期字段显示为 datetime.datetime(2023, 1, 1, 0, 0)

要解决这个问题,您可以采用以下几种方法来清洗和格式化数据:

1. 调整“执行SQL”指令的输出格式

在“执行SQL”指令的高级配置中(标准指令的其他指令里面的,见文末),您可以勾选“是否以文本格式返回查询结果”。

  • 不勾选(默认):返回的是列表嵌套列表(二维数组),如 [[val1, val2], [val3, val4]]

  • 勾选:返回的是列表嵌套字典,如 [{"列名1": val1, "列名2": val2}]。这在处理特定列数据时更方便。

  • 需要配合连接数据库指令【不推荐】

2. 使用 Python 脚本进行数据清洗(推荐)

这是最彻底的解决方法。通过一段简单的 Python 代码,将 Decimal 转换为浮点数或字符串,将 datetime 转换为标准日期字符串。

操作步骤:

  1. 在流程中添加“执行Python代码”指令。

  2. 传入 SQL 查询的结果变量(假设变量名为 sql_data)。

  3. 使用以下代码进行转换:

import datetime
from decimal import Decimal

def clean_sql_data(data):
    if not data:
        return data
    
    cleaned_data = []
    for row in data:
        new_row = {} if isinstance(row, dict) else []
        
        # 处理字典格式
        if isinstance(row, dict):
            for k, v in row.items():
                if isinstance(v, Decimal):
                    new_row[k] = float(v) # 转换为浮点数
                elif isinstance(v, datetime.datetime):
                    new_row[k] = v.strftime('%Y-%m-%d %H:%M:%S') # 转换为字符串
                else:
                    new_row[k] = v
        # 处理列表格式
        else:
            for v in row:
                if isinstance(v, Decimal):
                    new_row.append(float(v))
                elif isinstance(v, datetime.datetime):
                    new_row.append(v.strftime('%Y-%m-%d %H:%M:%S'))
                else:
                    new_row.append(v)
        cleaned_data.append(new_row)
    return cleaned_data

3. 使用 DataFrame 指令集

如果您需要将数据写入 Excel 或进行进一步分析,建议使用影刀的 DataFrame(数据表格) 扩展指令:

1.使用“创建DataFrame”指令将 SQL 结果转换为表格对象。

使用之前的效果

使用之后的效果

2.使用“df列转时间格式”或相关转换指令统一格式。

3.DataFrame 在写入 Excel 时会自动处理大部分 Python 原生类型的转换,使结果更整洁。

4. 在 SQL 语句中直接格式化

如果不想在影刀中处理,也可以在 MySQL 查询语句中使用 CASTCONVERTDATE_FORMAT 函数:

  • 日期格式化SELECT DATE_FORMAT(column_name, '%Y-%m-%d %H:%i:%s') FROM table

  • 数值格式化SELECT CAST(column_name AS CHAR) FROM table(转为字符串)或 SELECT column_name + 0 FROM table(强制转为普通数字)

注意这几个指令的区别

相关文档:

收藏1
全部评论1
最新
发布评论
评论