You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析含Null的多层JSON时Pandas报错的Lambda解决方案问询

问题解决:解析含Null的嵌套JSON时'NoneType' object has no attribute 'keys'报错

问题根源

报错来自pd.json_normalize解析sql_type['data']列表时,列表中存在null值。json_normalize会尝试读取每个元素的键,但null(Python中为None)没有keys属性,因此触发该错误。

解决方案

核心思路是先处理data列表中的None值,再交给pd.json_normalize解析。提供两种实现方式:

方式1:过滤掉None值(丢弃空数据)

修改原拼接代码,在列表推导式中过滤掉data里的None:

import json
import pandas as pd

with open(r'D:\meta.json', encoding='utf-16') as data_file:
    data = json.loads(data_file.read())
df = pd.json_normalize(data)

# 过滤data中的None值后再解析
result = pd.concat([
    pd.json_normalize([item for item in df['columns'][k]['sql_type']['data'] if item is not None])
    for k in df['columns'].keys()
])

方式2:用默认值替换None(保留数据位置)

如果需要保留原数据的行数,将None替换为包含默认日期的字典,同时使用Lambda函数完成转换:

import json
import pandas as pd

with open(r'D:\meta.json', encoding='utf-16') as data_file:
    data = json.loads(data_file.read())
df = pd.json_normalize(data)

# 定义默认日期字典
default_date = {"year": 1970, "month": 1, "day": 1, "start": 2299161.0}
# 使用Lambda替换None后解析
result = pd.concat([
    pd.json_normalize(map(lambda x: x if x is not None else default_date, df['columns'][k]['sql_type']['data']))
    for k in df['columns'].keys()
])

优化日期转换

原transformMDY函数可以简化为直接在解析后的DataFrame中生成完整日期:

# 生成标准化日期,空值填充为1970-01-01
result['Full_Date'] = pd.to_datetime(result[['year', 'month', 'day']], errors='coerce').fillna(pd.Timestamp('1970-01-01'))
# 可选:移除不需要的列
result.drop(['year', 'month', 'day', 'start'], axis=1, inplace=True)

内容的提问来源于stack exchange,提问作者jamiel22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:10:20