You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

boto3读取Dynamodb数据转CSV后小数丢失小数点问题求助

解决DynamoDB导出CSV时小数丢失小数点的问题

问题原因

boto3从DynamoDB获取的数值数据是以decimal.Decimal类型存储的,虽然pandas控制台打印时能正确解析显示,但导出CSV时,默认序列化逻辑会错误地将Decimal对象转换为无小数点的整数值(例如3.457变为3457)。

解决方案

以下是几种直接有效的解决方法:

方法1:转换DataFrame中的Decimal类型列

在构建DataFrame后,批量将所有Decimal类型转换为float(或字符串以保留精度),再执行导出:

from decimal import Decimal
import pandas as pd

# 原代码:构建DataFrame
df = pd.DataFrame(data)

# 新增:转换Decimal类型
def convert_decimal(value):
    if isinstance(value, Decimal):
        # 若担心精度损失,可替换为 return str(value)
        return float(value)
    return value

df = df.applymap(convert_decimal)

# 后续列调整和导出代码不变
first_column = df.pop('time')
df.insert(0,'time',first_column)
df.to_csv(r'C:\***\export.csv',index=False, header=True)

方法2:扫描DynamoDB时提前处理数据

在获取数据阶段就转换Decimal类型,避免后续DataFrame处理的问题:

from decimal import Decimal

# 新增:处理单条数据的函数
def process_dynamo_item(item):
    processed_item = {}
    for key, value in item.items():
        if isinstance(value, Decimal):
            processed_item[key] = float(value)  # 或 str(value)
        else:
            processed_item[key] = value
    return processed_item

# 修改扫描逻辑:处理每条数据
response = vopak_table.scan()
data = [process_dynamo_item(item) for item in response['Items']]

while 'LastEvaluatedKey' in response:
    response = vopak_table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])
    data.extend([process_dynamo_item(item) for item in response['Items']])

# 后续构建DataFrame和导出代码不变

方法3:导出时指定格式(适用于已转换为float的列)

如果已经将Decimal转为float,可通过float_format参数强制保留小数位数:

df.to_csv(r'C:\***\export.csv', index=False, header=True, float_format='%.4f')

验证

执行上述任一方法后,导出的CSV文件中小数点将正常保留,与控制台打印的DataFrame数值一致。

内容的提问来源于stack exchange,提问作者UwUs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:01:01