使用d3.js和dc.js将记录拆分并分组为每日集合
我是和的新手,我花了一周的大部分时间阅读和。它有一个相对陡峭的学习曲线,但我(慢慢地)开始熟悉个人操作。也就是说,我仍然缺乏实践经验来构建我所需要的东西 我有一个JSON文件,其中包含以下数据结构(记录集相对较大,约200万个对象): 我试图实现的是对数据进行组织,这样我就可以为每个设备创建一个每日正常运行时间报告,从中收集每个设备每天的累计事件时间 实际上,我正在尝试将原始数据(如上)转换为如下所示的新数据集:使用d3.js和dc.js将记录拆分并分组为每日集合,d3.js,dc.js,crossfilter,D3.js,Dc.js,Crossfilter,我是和的新手,我花了一周的大部分时间阅读和。它有一个相对陡峭的学习曲线,但我(慢慢地)开始熟悉个人操作。也就是说,我仍然缺乏实践经验来构建我所需要的东西 我有一个JSON文件,其中包含以下数据结构(记录集相对较大,约200万个对象): 我试图实现的是对数据进行组织,这样我就可以为每个设备创建一个每日正常运行时间报告,从中收集每个设备每天的累计事件时间 实际上,我正在尝试将原始数据(如上)转换为如下所示的新数据集: [ {"device":"device_1", "date
[
{"device":"device_1", "date": "01/01/2014", "cumulative": 2530},
{"device":"device_2", "date": "01/01/2014", "cumulative": 1234},
{"device":"device_1", "date": "01/02/2014", "cumulative": 456},
{"device":"device_2", "date": "01/02/2014", "cumulative": 198},
...
]
*其中,*累计*是该设备当天发生的所有累计事件的秒数
一旦我进入这个阶段,我可以使用类似于:d3.nest().key().rollup().entries()
的方法对准备显示的数据进行排序和分组
我怀疑d3有一个内置的机制来处理这种情况,但我目前的方法如下:
- 导入数据集
d3.json("data.json", function(error, json_data) { if (error)return console.warn(error); ... }
- 将字符串转换为日期对象
var dateFormat = d3.time.format("%m/%d/%Y %H:%M:%S"); json_data.forEach(function(d) { d.dstart = d.events.map(function(x) { return dateFormat.parse(x.start); }); d.dend = d.events.map(function(x) { return dateFormat.parse(x.end); }); });
- 每天为报告指定一个开始和结束日期范围
- 确定事件是否跨越1天以上,如果是,将事件分为几个部分
- 对每日设备事件的累计持续时间求和
(注意,我可以控制JSON数据格式!我可以直接从技术上创建最终的数据集。但是,当前的格式对于其他报表非常有用,我希望避免使用两个数据文件,因为它们是。我想到的数据结构是一个区间树。我没有尝试过这个库,但它可能会有所帮助-)
否则,至少你可以跳过最后一步,按日中断事件。累积是交叉筛选的优势所在-使用
reduceSum
可能还有其他库可以帮助你做到这一点,但d3并不是一个真正的数据预处理库。我认为你的做法是正确的。你不需要改变格式除非文件大小会导致速度变慢。您是否碰巧遇到过一个可以实现这一点的库?
var dateFormat = d3.time.format("%m/%d/%Y %H:%M:%S");
json_data.forEach(function(d) {
d.dstart = d.events.map(function(x) {
return dateFormat.parse(x.start);
});
d.dend = d.events.map(function(x) {
return dateFormat.parse(x.end);
});
});