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
相关产品推荐
相关产品推荐

