D3.js d3js:多个值有一个日期范围(1月1日-1月20日=300),我想要一个更短的时间段的总计

D3.js d3js:多个值有一个日期范围(1月1日-1月20日=300),我想要一个更短的时间段的总计,d3.js,D3.js,我正试图从一个有数据的大型tsv获得很多可视化选项。 我用d3创造了很多很酷的数据 数据结构如下所示: 项目、开始日期、结束日期、值 那么,假设我们在12月/1月有3个类似项目的列表: gasoline,20-12-2009,10-01-2010,400 gasoline,01-01-2010,31-01-2010,1000 gasoline,21-01-2010,31-01-2010,900 正如你所看到的,大部分都是在一月份,但第一个项目部分是在前一年的12月份。因此,如果我想要1月400

我正试图从一个有数据的大型tsv获得很多可视化选项。 我用d3创造了很多很酷的数据

数据结构如下所示: 项目、开始日期、结束日期、值

那么,假设我们在12月/1月有3个类似项目的列表:

gasoline,20-12-2009,10-01-2010,400
gasoline,01-01-2010,31-01-2010,1000
gasoline,21-01-2010,31-01-2010,900
正如你所看到的,大部分都是在一月份,但第一个项目部分是在前一年的12月份。因此,如果我想要1月400+1000+900的总数,就不正确了

我可以解析数据,每天单独输入,把它放在不适合未来的地方,我可能会遇到严重的舍入错误

在加载时,我会这样做:

data.forEach(function(d) {
    d.startdate = StatsLoader.format.parse(String(d.startdate));
    d.enddate = StatsLoader.format.parse(String(d.enddate));
    d.period = (d.enddate - d.startdate) / StatsLoader.periodSize; // 86400000, 1 day in ms
    d.value = +d.value;
});
所以我有一个很好的对象,它有一个名称,开始和结束日期,一个值,我知道以天为单位的周期

现在我想得到日期范围内的总和,但我不知道从哪里开始

我的普通“sum”函数看起来像这样,假设有多个项目名称

var nest = d3.nest()
    .key(function(d) { return d.item; })
    .entries(data);

var piechartData = [];
nest.forEach(function(n) {
    piechartData.push({
    name: n.key,
    value: d3.sum(n.values, function(d) { return d.value; })
    })
})
我觉得我应该以某种方式使用quantize?还是域名


谢谢

假设您有一个由开始日期和结束日期给定的日期范围,计算部分和的代码如下所示

function getTotal(range, data) {
  var sum = 0;
  data.forEach(function(d) {
    if(d.startdate <= range.startdate && d.enddate >= range.enddate) {
      var duration = (Math.min(d.enddate, range.enddate) -
                     Math.max(d.startdate, range.startdate)) / StatsLoader.periodSize;
      sum += d.value / d.period * duration;
    }
  });
  return sum;
}

当然,您可以优化此代码。这适用于任意范围。

谢谢,这似乎是一个很好的解决方案。也许我看得太多了,就像d3应该已经弄明白了一样;在回家的路上,我想也许可以以某种方式扩展或修改域函数。感觉您建议的解决方案可能会占用大量数据集。。。或者没有?当然,这是一个n^2算法。您几乎可以肯定地通过使用更好的数据结构等来改进这一点。因此,您是否建议对我的数据进行预处理?以天/月为单位拆分我的值,然后使用d3?很多记忆。。。