使用Python从值为NaN的JSON中删除对象?

时间:2019-07-22 19:31:28

标签: python json nan

我最终的输出JSON文件采用以下格式

    [
     {
    "Type": "UPDATE",
    "resource": {
        "site ": "Lakeside mh041",
        "name": "Total Flow",
        "unit": "CubicMeters",
        "device": "2160 LaserFlow Module",
        "data": [
            {
                "timestamp": [
                    "1087009200"
                ],
                "value": [
                    6945.68
                ]
            },
            {
                "timestamp": [
                    "1087095600"
                ],
                "value": [
                    NaN
                ]
            },
            {
                "timestamp": [
                    "1087182000"
                ],
                "value": [
                    7091.62
                ]
            },

如果“值”为NaN,我想删除整个对象。

预期产量

     [
      {
    "Type": "UPDATE",
    "resource": {
        "site ": "Lakeside mh041",
        "name": "Total Flow",
        "unit": "CubicMeters",
        "device": "2160 LaserFlow Module",
        "data": [
            {
                "timestamp": [
                    "1087009200"
                ],
                "value": [
                    6945.68
                ]
            },
            {
                "timestamp": [
                    "1087182000"
                ],
                "value": [
                    7091.62
                ]
            },

由于文件格式的原因,我无法从csv文件中删除空白值。

我已经尝试过:

  with open('Result.json' , 'r') as j:
     json_dict = json.loads(j.read())
     json_dict['data'] = [item for item in json_dict['data'] if 
        len([val for val in item['value'] if isnan(val)]) == 0]

  print(json_dict)

错误-json_dict ['data'] = [json_dict ['data']中项目的项目,如果len([isnan(val)]中is的项目['value']中val的val)== 0] TypeError:列表索引必须是整数或切片,而不是str

2 个答案:

答案 0 :(得分:1)

要测试值是否为NaN,可以使用math.isnan()函数(doc):

data = '''{"data": [
            {
                "timestamp": [
                    "1058367600"
                ],
                "value": [
                    9.65
                ]
            },
            {
                "timestamp": [
                    "1058368500"
                ],
                "value": [
                    NaN
                ]
            },
            {
                "timestamp": [
                    "1058367600"
                ],
                "value": [
                    4.75
                ]
            }
        ]}'''

import json
from math import isnan

data = json.loads(data)
data['data'] = [i for i in data['data'] if not isnan(i['value'][0])]

print(json.dumps(data, indent=4))

打印:

{
    "data": [
        {
            "timestamp": [
                "1058367600"
            ],
            "value": [
                9.65
            ]
        },
        {
            "timestamp": [
                "1058367600"
            ],
            "value": [
                4.75
            ]
        }
    ]
}

答案 1 :(得分:1)

如果import json from math import isnan json_str = ''' [ { "Type": "UPDATE", "resource": { "site ": "Lakeside mh041", "name": "Total Flow", "unit": "CubicMeters", "device": "2160 LaserFlow Module", "data": [ { "timestamp": [ "1087009200" ], "value": [ 6945.68 ] }, { "timestamp": [ "1087095600" ], "value": [ NaN ] } ] } } ] ''' json_dict = json.loads(json_str) for typeObj in json_dict: resource_node = typeObj['resource'] resource_node['data'] = [ item for item in resource_node['data'] if len([val for val in item['value'] if isnan(val)]) == 0 ] print(json_dict) 有多个值 然后,

-OutFile