IBM Cloudant与Python对接:嵌套JSON提取及DataFrame构建
嘿,既然已经搞定了Cloudant和Python的连接,接下来处理嵌套JSON转DataFrame这件事就很清晰了。我给你拆解成几步来做,保证你能快速上手~
步骤1:从Cloudant获取目标嵌套JSON文档
假设你已经用cloudant库完成了客户端初始化和登录,直接获取目标数据库里的文档即可:
from cloudant.client import Cloudant # 这里替换成你的Cloudant账号信息 client = Cloudant("你的用户名", "你的API密钥", url="https://你的账号域名.cloudantnosqldb.appdomain.cloud") client.connect() # 定位到目标数据库和文档 target_db = client["你的数据库名称"] target_doc = target_db["1"] # 示例文档的_id是"1",替换成你的文档ID nested_json_data = target_doc.get() # 拿到完整的嵌套JSON结构 client.disconnect()
步骤2:逐层解析嵌套JSON,提取核心字段
你的JSON是多层嵌套结构:payload -> devices -> modules -> dashboard_data,我们需要逐层遍历,把分散在不同层级的关键信息整合到统一的结构化数据里。比如要提取设备ID、模块ID、温度、湿度这些字段:
import pandas as pd # 初始化空列表存储提取后的数据 structured_data = [] # 遍历顶层的devices列表 for device in nested_json_data["payload"]["devices"]: device_id = device["_id"] device_last_date = device["last_date"] # 遍历每个设备下的modules列表 for module in device["modules"]: module_id = module["_id"] module_last_seen = module["last_seen"] # 提取仪表盘核心数据 dashboard_info = module["dashboard_data"] # 把所有需要的字段打包成字典 data_row = { "主文档ID": nested_json_data["_id"], "设备ID": device_id, "设备最后更新时间戳": device_last_date, "模块ID": module_id, "模块最后上线时间戳": module_last_seen, "仪表盘UTC时间": dashboard_info["time_utc"], "温度": dashboard_info["Temperature"], "湿度": dashboard_info["Humidity"], "最低温度": dashboard_info["min_temp"], "最高温度": dashboard_info.get("max_temp"), # 用get避免字段缺失报错 "最低温度时间戳": dashboard_info["date_min_temp"], "最高温度时间戳": dashboard_info["date_max_temp"] } structured_data.append(data_row)
步骤3:将结构化数据转为DataFrame
现在只需要把列表传入pd.DataFrame(),就能得到你需要的表格了:
final_df = pd.DataFrame(structured_data) # 可选:把时间戳转成可读的日期格式 final_df["设备最后更新时间"] = pd.to_datetime(final_df["设备最后更新时间戳"], unit="s") final_df["仪表盘UTC时间"] = pd.to_datetime(final_df["仪表盘UTC时间"], unit="s") print(final_df.head())
额外实用提示
- 如果要处理多个文档,只需要在外层加一个遍历数据库文档的循环即可:
for doc in target_db: nested_json = doc.get() # 重复上面的提取逻辑... - 对于可能缺失的字段,一定要用
dict.get(key, 默认值)来避免KeyError崩溃; - 如果需要筛选特定文档,可以用Cloudant的查询功能(比如
target_db.get_query_result())提前过滤,减少数据处理量。
内容的提问来源于stack exchange,提问作者emily.mi
相关产品推荐
相关产品推荐

