目录
背景:
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 2404222374666966081 2404230989514229442 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 NoneIf 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 2404222374666966051 2404230989514229442 240423138116796702Name: order_no, dtype: object
可以发现输出结果是正确的