D3.js d3js:多个值有一个日期范围(1月1日-1月20日=300),我想要一个更短的时间段的总计
我正试图从一个有数据的大型tsv获得很多可视化选项。 我用d3创造了很多很酷的数据 数据结构如下所示: 项目、开始日期、结束日期、值 那么,假设我们在12月/1月有3个类似项目的列表: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
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?很多记忆。。。