Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用d3.js对已装箱的时间序列求和?_D3.js - Fatal编程技术网

如何使用d3.js对已装箱的时间序列求和?

如何使用d3.js对已装箱的时间序列求和?,d3.js,D3.js,我想要一个简单的图形,如: 我拥有的数据是一个简单的事务列表,其中包含两个属性: 时间戳 数量 我尝试了d3.layout.histogram().bins(),但它似乎只支持计算事务 我一定不是唯一一个在寻找它的人,是吗?直方图代码不支持这一点,但你可以自己轻松地进行分类。假设你有一个日期和每个交易的计数,你可以像这样按天分类 var bins = {}; transactions.forEach(function(t) { var key = t.date.toDateStri

我想要一个简单的图形,如:

我拥有的数据是一个简单的事务列表,其中包含两个属性:

  • 时间戳
  • 数量
我尝试了d3.layout.histogram().bins(),但它似乎只支持计算事务


我一定不是唯一一个在寻找它的人,是吗?

直方图代码不支持这一点,但你可以自己轻松地进行分类。假设你有一个日期和每个交易的计数,你可以像这样按天分类

var bins = {};
transactions.forEach(function(t) {
    var key = t.date.toDateString();
    bins[key] = bins[key] || 0;
    bins[key] += t.amount;
});

如果需要,可以将日期字符串解析回日期;这里使用
.toDateString()
的要点是,时间部分被截断,所有东西都按天分类。如果你想按另一个时间间隔进行装箱,你可以使用相同的技术提取日期的不同部分。

好的,所以IRC的人帮我指出并指向
nest
,这很有效(这是CoffeeScript):

这里的诀窍是d3.time.day,它获取时间戳,并告诉您时间戳属于哪一天(晚上12点)。此函数和其他函数,如
d3.time.week
等。。我能很好地理解时间序列

另一个技巧是
nest().rollup()
函数,它在按
key()
分组后,对给定
天的所有事件求和

我最不想做的就是在没有交易的日子里插入空值。这是代码的最后一部分:

# Interpolate empty vals
nested_data.sort((a, b) -> d3.descending(a.date, b.date))
ex = d3.extent(nested_data, (d) -> d.date)
each_day = d3.time.days(ex[0], ex[1])

# Build a hashmap with the days we have
data_hash = {}
angular.forEach(data, (d) ->
  data_hash[d.date] = d.values
)

# Build a new array for each day, including those where we didn't have transactions
new_data = []
angular.forEach(each_day, (d) ->
  val = 0
  if data_hash[d]
    val = data_hash[d]
  new_data.push({date: d, values: val})
)

final_data = new_data

希望这对别人有帮助

是的,这其实是一个快速的方法。我可能会在这里使用
d3.time.day
而不是toDateString()。。所以我可以通过使用d3.time.week来轻松地切换到不同的箱子大小。
# Interpolate empty vals
nested_data.sort((a, b) -> d3.descending(a.date, b.date))
ex = d3.extent(nested_data, (d) -> d.date)
each_day = d3.time.days(ex[0], ex[1])

# Build a hashmap with the days we have
data_hash = {}
angular.forEach(data, (d) ->
  data_hash[d.date] = d.values
)

# Build a new array for each day, including those where we didn't have transactions
new_data = []
angular.forEach(each_day, (d) ->
  val = 0
  if data_hash[d]
    val = data_hash[d]
  new_data.push({date: d, values: val})
)

final_data = new_data