如何按年/季度筛选并汇总2018-2019年股息数组数据?
问题
我正尝试从指定URL的对象中按年和季度整合股息数据。已通过以下代码获取股息日期与金额,并将日期转换为YYYY Q格式。现需移除2018和2019年以外的股息数据,仅整合这两年内的季度数据:无股息数据的季度填0,同一季度多笔股息则求和,该如何实现?
原代码
function test() { const url = 'https://query1.finance.yahoo.com/v8/finance/chart/BAYRY?formatted=true&lang=en-US®ion=US&interval=1d&period1=1451624400&period2=1577854799&events=div&useYfid=true&corsDomain=finance.yahoo.com'; const res = UrlFetchApp.fetch(url, { muteHttpExceptions: true }).getContentText();; const obj = JSON.parse(res); const dividend_id = Object.keys(obj.chart.result[0].events.dividends); var dividend = dividend_id.map((id => [ obj.chart.result[0].events.dividends[id].date, obj.chart.result[0].events.dividends[id].amount])); var dividend = dividend.map(arr => [new Date(arr[0] * 1000).toLocaleDateString('en-US'), arr[1]]); console.log(dividend) var dividend = dividend.map(arr => [(arr[0].slice(-4) + ' Q' + (getQuarter(new Date(arr[0])))), arr[1]]); console.log(dividend) function getQuarter(date = new Date()) { return Math.floor(date.getMonth() / 3 + 1); } }
解决方案
通过以下步骤实现需求:
- 筛选目标年份数据:过滤掉2018、2019年以外的股息条目
- 季度金额求和:用对象累加同一季度的多笔股息
- 补全无股息季度:生成两年所有季度的完整列表,空缺季度填充0
修改后的完整代码:
function test() { const url = 'https://query1.finance.yahoo.com/v8/finance/chart/BAYRY?formatted=true&lang=en-US®ion=US&interval=1d&period1=1451624400&period2=1577854799&events=div&useYfid=true&corsDomain=finance.yahoo.com'; const res = UrlFetchApp.fetch(url, { muteHttpExceptions: true }).getContentText(); const obj = JSON.parse(res); const dividend_id = Object.keys(obj.chart.result[0].events.dividends); // 提取日期与金额,直接转换为季度格式 let dividend = dividend_id.map(id => { const date = new Date(obj.chart.result[0].events.dividends[id].date * 1000); const year = date.getFullYear(); const quarter = Math.floor(date.getMonth() / 3 + 1); return [`${year} Q${quarter}`, obj.chart.result[0].events.dividends[id].amount]; }); // 筛选2018、2019年数据 dividend = dividend.filter(item => { const year = parseInt(item[0].split(' ')[0]); return year === 2018 || year === 2019; }); // 按季度累加股息金额 const quarterlySum = {}; dividend.forEach(item => { const quarterKey = item[0]; quarterlySum[quarterKey] = (quarterlySum[quarterKey] || 0) + item[1]; }); // 生成完整季度列表并补0 const allQuarters = [ '2018 Q1', '2018 Q2', '2018 Q3', '2018 Q4', '2019 Q1', '2019 Q2', '2019 Q3', '2019 Q4' ]; const finalResult = allQuarters.map(quarter => [ quarter, quarterlySum[quarter] || 0 ]); console.log(finalResult); }
代码说明
- 简化日期转季度逻辑,直接通过
getFullYear()和getMonth()获取年份季度,避免重复解析字符串 - 用
filter方法精准筛选目标年份数据 - 借助对象
quarterlySum实现同季度金额累加,处理多笔股息的求和需求 - 预定义两年所有季度的列表,遍历后自动补全无股息季度的0值,保证结果完整性
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

