如何补全JSON中1996-2011缺失年份 对应值填充为0
问题可行性结论
该需求完全可以实现,不需要复杂工具,仅需按照固定逻辑处理数据即可,核心是保证年份序列连续、缺失值统一填0、原始非年度的特殊字段(如TTM)保留原有位置。
核心处理逻辑
- 先对齐原始数据中
ArrayYears和ArrayValue的索引对应关系,将非年度的TTM项单独提取存储,避免混入年度序列处理 - 生成1988年到2021年的连续年度字符串序列,和原数据的年份格式保持一致
- 遍历生成的完整年度序列,对应年份存在原始值则取原始值,不存在则填充0
- 将单独存储的
TTM项追加到补全后的年度序列、数值序列末尾,还原原始数据结构
可直接运行的代码示例
JavaScript版本
const rawData = { "data": { "ArrayValue": [ 0.0030350000000000004, 0.003661, 0.0080348532, 0.0053554275, 0.004284, 0.008569710000000001, 0.008569710000000001, 0.007498282499999999, 0.189286, 0.42142999999999997, 0.461429, 0.5075000000000001, 0.5575, 0.615, 0.705, 0.76, 0.8075, 0.865, 0.89 ], "ArrayYears": [ "1988","1989","1990","1991","1992","1993","1994","1995","2012","2013", "2014","2015","2016","2017","2018","2019","2020","2021","TTM" ] } }; // 构建年份-值映射,分离TTM项 const yearValueMap = new Map(); let ttmValue = null; rawData.data.ArrayYears.forEach((year, idx) => { if (year === 'TTM') { ttmValue = rawData.data.ArrayValue[idx]; return; } yearValueMap.set(year, rawData.data.ArrayValue[idx]); }); // 生成完整序列并填充缺失值 const fullYears = [], fullValues = []; for (let y = 1988; y <= 2021; y++) { const yStr = String(y); fullYears.push(yStr); fullValues.push(yearValueMap.get(yStr) ?? 0); } // 还原TTM项 fullYears.push('TTM'); fullValues.push(ttmValue); const fixedData = { data: { ArrayValue: fullValues, ArrayYears: fullYears } };
Python版本
raw_data = { "data": { "ArrayValue": [ 0.0030350000000000004, 0.003661, 0.0080348532, 0.0053554275, 0.004284, 0.008569710000000001, 0.008569710000000001, 0.007498282499999999, 0.189286, 0.42142999999999997, 0.461429, 0.5075000000000001, 0.5575, 0.615, 0.705, 0.76, 0.8075, 0.865, 0.89 ], "ArrayYears": [ "1988","1989","1990","1991","1992","1993","1994","1995","2012","2013", "2014","2015","2016","2017","2018","2019","2020","2021","TTM" ] } } # 构建映射并分离TTM year_value_map = dict(zip(raw_data["data"]["ArrayYears"], raw_data["data"]["ArrayValue"])) ttm_value = year_value_map.pop("TTM") # 生成完整序列填充0 full_years = [str(y) for y in range(1988, 2022)] full_values = [year_value_map.get(y, 0) for y in full_years] # 还原TTM项 full_years.append("TTM") full_values.append(ttm_value) fixed_data = {"data": {"ArrayValue": full_values, "ArrayYears": full_years}}
处理结果校验
补全后1996年至2011年共16个缺失年份的数值全部为0,最终ArrayYears和ArrayValue长度均为35(34个1988-2021连续年度 + 1个TTM项),索引完全对应。
其他编程语言实现逻辑完全一致,不需要依赖第三方库,仅用基础语法即可完成处理。
内容的提问来源于stack exchange,提问作者HappyGilmore
相关产品推荐
相关产品推荐

