好的,IRC 人员帮助我并指出nest
,效果很好(这是 CoffeeScript):
nested_data = d3.nest()
.key((d) -> d3.time.day(d.timestamp))
.rollup((a) -> d3.sum(a, (d) -> d.amount))
.entries(incoming_data) # An array of {timestamp: ..., amount: ...} objects
# Optional
nested_data.map (d) ->
d.date = new Date(d.key)
这里的技巧是d3.time.day
它采用时间戳,并告诉您该时间戳属于哪一天(晚上 12 点)。这个功能和其他类似的功能d3.time.week
等..可以很好地对时间序列进行分类。
另一个技巧是nest().rollup()
函数,经过分组后key()
,对给定的所有事件求和day
.
我最不想做的就是在没有交易的日子里插入空值。这是代码的最后一部分:
# 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
希望这对某人有帮助!