pandas 读取JSON字符串解析长整形丢失数据精度,读取值与实际值不一致

文章讲述了在使用pandas的read_json函数读取包含长数字order_no的JSON数据到Excel时,由于pandas自动推断数据类型导致精度丢失。通过指定order_no的数据类型为字符串,解决了这个问题。
摘要由CSDN通过智能技术生成

目录

背景:

JSON字符串

解析代码

解决方案


背景:

在使用pandas read_json方法读取JSON存为Excel文件时,发现Excel中order_no的值与JSON字符串中的值不一致,开始怀疑是Excel保存精度问题,但是Excel输出实际为字符串格式应该不会存在精度问题,后面直接在输出Excel文件前打印pandas 对象该列值,发现在pandas中该值就已经不准了,所以初步判断是pandas的问题,因为之前也遇到过pandas自动把unix时间戳转换了,问题在于在读取 JSON 数据时,Pandas 可能会根据数据的值自动推断数据类型,导致长数字被解释为整数类型而不是字符串类型。

JSON字符串

order_list = [

    {

        "order_no": "240422237466696605",

      

    },

    {

        "order_no": "240423098951422944",

    

    },

    {

        "order_no": "240423138116796702",

    }

]

  

使用pandas输出order_no发现输出的order_no与字符串中的值不一致。输出结果:

0    240422237466696608

1    240423098951422944

2    240423138116796704

解析代码

            order_json = json.dumps(order_list, indent=2)

            print(order_json)

            es_pd = pd.read_json(StringIO(order_json), convert_dates=False)



            # 240422237466696605等长数字pandas处理时会丢失精度,需要转换为字符串



            print('------------------------------')

            print(es_pd['order_no'])

            print('------------------------------')

由于在输出前并没有对order_no做任何计算,所以判断是pandas字段对数据进行了转换,查看read_json方法源码,发现可以指定列数据类型

dtype : bool or dict, default None

        If True, infer dtypes; if a dict of column to dtype, then use those;

        if False, then don't infer dtypes at all, applies only to the data.



        For all ``orient`` values except ``'table'``, default is True.

解决方案

那我们指定order_no数据类型看看:

es_pd = pd.read_json(StringIO(order_json), convert_dates=False, dtype={'order_no': str})

重新运行代码查看输出:

0    240422237466696605

1    240423098951422944

2    240423138116796702

Name: order_no, dtype: object

可以发现输出结果是正确的

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知识的宝藏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值