查找时间序列中缺少的季度

时间:2018-03-04 20:05:27

标签: javascript datetime time-series momentjs

我试图看看如何在Javascript中填写像这样的时间序列中缺少的财务季度:

["2012-Q2","2012-Q4","2013-Q4","2014-Q1","2014-Q2","2014-Q3",
 "2014-Q4","2015-Q1","2015-Q2","2015-Q3","2015-Q4","2016-Q1",
 "2016-Q2","2016-Q3","2016-Q4","2017-Q1","2017-Q2","2017-Q3",
 "2017-Q4","2018-Q1"]
  • 我想以某种方式得到一个缺少元素的时间序列,即每年我应该看到4"日期"。
  • 我不介意忽略第一个元素"2012-Q2"之前的第一个季度以及最后一个元素" 2018-Q1"之后的最后三个季度。

我知道moment.js具有quarter()fquarter()等功能(通过插件),但我正在寻找更接近其他方式的东西。我已经有了季度(作为日期字符串),我必须将它们解析为日期对象。

我需要填补"四分之一洞"在这些输入字符串值之间。

在我的情况下,我可能需要首先解析那些自定义格式的日期字符串,使它们成为moment可以理解的东西,但我有点迷失。在这里https://momentjs.com/docs/#/parsing/string-format/,潜在格式可能涉及Y多年,Q为季度,但我不知道如何在每个输入日期字符串中转义文字Q那个数组?

另外假设我可以以某种方式将所有这些日期字符串解析为moment个对象,那么我不确定这有助于填补漏洞吗?

我找不到涉及日期类型的纯JavaScript解决方案。

另一种方法可能是解析那些日期字符串并使用substring获取年份和季度数字,然后手动填写检查年/季度对的孔,有什么比这简单吗?

3 个答案:

答案 0 :(得分:1)

为什么不制作一个从特定范围返回季度的函数?

function getQuarters(startYear, endYear){
  var times = [];
  for(var i = startYear; i <= endYear; i++){
    times.push(i + "-Q1");
    times.push(i + "-Q2");
    times.push(i + "-Q3");
    times.push(i + "-Q4");
  }
  return times;
}

通话:

getQuarters(2017,2017);

返回:

["2017-Q1", "2017-Q2", "2017-Q3", "2017-Q4"]

答案 1 :(得分:1)

假设你想得到一个缺少值的数组,你可以采用一个开始的四分之一和cehck来反对给定的数据来推动四分之一或递增数组的索引。

&#13;
&#13;
function incQ(time) {
    time[1]++;
    if (time[1] === 5) {
        time[0]++;
        time[1] = 1;
    }
}

var quarters = ["2012-Q2", "2012-Q4", "2013-Q4", "2014-Q1", "2014-Q2", "2014-Q3", "2014-Q4", "2015-Q1", "2015-Q2", "2015-Q3", "2015-Q4", "2016-Q1", "2016-Q2", "2016-Q3", "2016-Q4", "2017-Q1", "2017-Q2", "2017-Q3", "2017-Q4", "2018-Q1"],
    actual = quarters[0].split('-Q'),
    missing = [],
    i = 0;

while (i < quarters.length) {
    if (actual.join('-Q') !== quarters[i]) {
        missing.push(actual.join('-Q'));
    } else {
        i++;
    }
    incQ(actual);
}

console.log(missing);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

假设您需要输入数组的第一个到最后一个之间的完整四分之一列表,您可以:

这是一个实时样本:

end
var quarters = ["2012-Q2","2012-Q4","2013-Q4","2014-Q1","2014-Q2","2014-Q3",
 "2014-Q4","2015-Q1","2015-Q2","2015-Q3","2015-Q4","2016-Q1",
 "2016-Q2","2016-Q3","2016-Q4","2017-Q1","2017-Q2","2017-Q3",
 "2017-Q4","2018-Q1"];

var format = 'YYYY[-Q]Q';
var start = moment(quarters[0], format);
var end = moment(quarters[quarters.length-1], format);

var results = [];
while( start.isSameOrBefore(end) ){
  results.push(start.format(format));
  start.add(1, 'Q');
}
console.log(results);