6

假设我有这个 CSV 文件

Day,What
2013-10-27,Apple
2013-10-27,Cake
2013-10-27,Apple
2013-10-28,Apple
2013-10-28,Apple
2013-10-28,Blueberry
2013-10-28,Orange

我想用 D3.js 绘制一个时间序列图。我需要做的就是显示每天的行数总和。例如,11 月 27 日的值应为 3,28 日的值应为 4。

有什么办法可以存档吗?我一直在尝试从 CSV 中创建一个新的数据集,但没有得到积极的结果。

var dataset;

d3.csv("data.csv", function(d) {
  return {
    Day: new Date(d.Day),
    What: d.What
  };
}, 

function(error, rows) {
    dataset = rows;
    // I SUPPOSE THE FUNCTION THAT GENERATE THE NEW DATASET SHOULD GO THERE     
});
4

2 回答 2

2

在累积计数时,您可以使用 JavaScript 对象属性的快速查找作为索引:

var counts = {};
rows.forEach(function(r) {
    if (!counts[r.Day]) {
        counts[r.Day] = 0;
    }
    counts[r.Day]++;
});

然后你需要将它转换回一个数组,以便你可以将它与 D3 一起使用:

var data = [];
Object.keys(counts).forEach(function(key) {
    data.push({
        day: key,
        count: counts[key]
    });
});

我在这里假设您想忽略“什么”列,因为您只讨论了汇总天数,并且同一天有不同的“什么”值。如果您想在计数时考虑“什么”,您可以将其构建到原始counts对象的键中 ( r.Day + r.What)。

编辑:根据评论,添加带有复合键的代码。

var counts = {};
rows.forEach(function(r) {
    var key = r.Day + r.What;
    if (!counts[key]) {
        counts[key] = {
           day: r.Day,
           what: r.What,
           count: 0
        };
    }
    counts[key].count++;
});

var data = [];
Object.keys(counts).forEach(function(key) {
    data.push(counts[key]);
});
于 2013-10-31T16:24:13.217 回答
0

沿着这些思路的函数应该可以解决问题。我目前无法在计算机上对其进行测试,所以如果它不起作用,请告诉我,因为我可能打错了!

function createNewArray(dataset) {
  var lastDate = dataset[0].Date;  // initialise
  var count = 0;
  var newArray = new Array();
  for (var i = 0; i < dataset.length; i++) {
      if (dataset[i].Date != lastDate || i == dataset.length-1) {
          // on a new day (or the final row), so push value and reset count variable
          newArray.push({ Day: lastDate, Count: count });
          count = 0;
      }        
      count++;        
      lastDate = dataset[i].Date;
  }
  return newArray;
}
于 2013-10-31T16:25:37.540 回答