我正在努力通过json_normalize获得所需的信息。我查看了文档以及可能深度嵌套的JSON文件的10个示例,但我不太了解该函数的上下文以提取正确的信息。我正在尝试建立一个数据框,其中将包含每个传感器的带有时间戳的值(值键)。 1534023900是UTC秒的时间戳。
下面是JSON的简短示例。
有什么想法吗?
{
"created": "2020-05-12T15:10:37Z",
"device": {
"device_info": {
"device_fw": 204,
"device_sn": "06-02133",
"device_trait": 2,
"device_type": 190
},
"timeseries": [
{
"configuration": {
"sensors": [
{
"measurements": [
"BATTERY",
"BATTERY_MV"
],
"port": 7,
"sensor_bonus_value": "Unavailable",
"sensor_firmware_ver": "Unavailable",
"sensor_number": 133,
"sensor_sn": "Unavailable"
},
{
"measurements": [
"REFERENCE_KPA",
"TEMPC_LOGGER"
],
"port": 8,
"sensor_bonus_value": "Unavailable",
"sensor_firmware_ver": "Unavailable",
"sensor_number": 134,
"sensor_sn": "Unavailable"
}
],
"valid_since": "2018-08-11T21:45:00Z",
"values": [
[
1534023900,
0,
19,
[
{
"description": "Battery Percent",
"error": false,
"units": "%",
"value": 100
},
{
"description": "Battery Voltage",
"error": false,
"units": " mV",
"value": 7864
}
],
[
{
"description": "Reference Pressure",
"error": false,
"units": " kPa",
"value": 100.62
},
{
"description": "Logger Temperature",
"error": false,
"units": " \u00b0C",
"value": 28.34
}
]
]
}
}
}
}
}
}
答案 0 :(得分:0)
修订的JSON
{ “ created”:“ 2020-05-12T15:10:37Z”, “设备”:{ “设备信息”: { “ device_fw”:204, “ device_sn”:“ 06-02133”, “ device_trait”:2 “ device_type”:190 }, “时间序列”: [ { “配置”:{ “传感器”:[ { “测量”: [ “电池”, “ BATTERY_MV” ], “端口”:7 “ sensor_bonus_value”:“不可用”, “ sensor_firmware_ver”:“不可用”, “ sensor_number”:133, “ sensor_sn”:“不可用” }, { “测量”: [ “ REFERENCE_KPA”, “ TEMPC_LOGGER” ], “端口”:8 “ sensor_bonus_value”:“不可用”, “ sensor_firmware_ver”:“不可用”, “ sensor_number”:134, “ sensor_sn”:“不可用” } ], “ valid_since”:“ 2018-08-11T21:45:00Z”, “值”:[ [ 1534023900, 0, 19 [ { “说明”:“电池百分比”, “错误”:错误, “单位”: ”%”, “值”:100 }, { “描述”:“电池电压”, “错误”:错误, “单位”:“ mV”, “值”:7864 } ], [ { “描述”:“参考压力”, “错误”:错误, “ units”:“ kPa”, “值”:100.62 }, { “ description”:“记录仪温度”, “错误”:错误, “ units”:“ \ u00b0C”, “值”:28.34 } ] ] ] } }] } }
答案 1 :(得分:0)
jmespath可以帮助处理嵌套数据:docs非常强大,但是访问数据的基础是:如果它是密钥,那么您可以使用.
不是数据中的第一项,如果它是数组/列表,请使用[]
您的数据位置摘要:device -> timeseries(dict)->[](array)->configuration(dict)->values(key)->[](array)->[0](array and get the first value)
实际代码:
import jmespath
expression = jmespath.compile('device.timeseries[].configuration.values[][0]')
expression.search(data)
[1534023900]