-->

拆分和分组记录到使用d3.js和dc.js日常套(Splitting and grouping re

2019-10-20 12:35发布

我是新来d3.js和dc.js和我花一个星期通过阅读的最好的部分教程和API 。 它有一个比较陡峭的学习曲线,但是我(慢)熟悉单个操作。 尽管如此我仍然缺乏实践经验,构建我需要什么。

我有一个包含以下数据结构的JSON文件(该记录集比较大〜2个亿个对象):

[
    {
        "index": "device_1",
        "state": -1,
        "frequencies": [
            "800PS"
        ],
        "events": [
            {
                "start": "04/07/2014 04:24:19",
                "end": "07/21/2014 08:53:19",
                "name": "event_1234"
            }
        ]
    },
    {
        "index": "device_2",
        "state": 1,
        "frequencies": [
            "2100AWS",
            "1900PCS"
        ],
        "events": [
            {
                "start": "02/20/2014 04:03:20",
                "end": "04/30/2014 07:24:35",
                "name": "event_3456"
            },
            {
                "start": "04/30/2014 07:25:37",
                "end": "07/01/2014 06:35:44",
                "name": "event_766"
            },
            {
                "start": "06/02/2014 00:02:16",
                "end": "06/02/2014 00:04:25",
                "name": "event_8967"
            },
            {
                "start": "06/11/2014 15:38:59",
                "end": "06/11/2014 15:41:15",
                "name": "event_385"
            },
            {
                "start": "06/28/2014 07:37:00",
                "end": "06/28/2014 07:39:34",
                "name": "event_8959"
            },
            {
                "start": "07/01/2014 07:06:06",
                "end": "07/03/2014 03:27:55",
                "name": "event_2654"
            },
            {
                "start": "07/03/2014 04:16:55",
                "end": "07/21/2014 08:53:19",
                "name": "event_94768"
            }
        ]
    },
...
]

我试图做到的,是对数据进行组织,所以我可以为每个设备每天正常工作时间报告,我每个设备收集每天的累积活动时间。

有效地我想原始数据(上图)转换成新的数据集,看起来是这样的:

    [
        {"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数据格式控制!我可以在技术上直接创建最终的数据集。但是,目前的格式在其他报告中非常有用,我很希望避免两个数据文件,因为它们是<20MB每个所以最好我需要避免改变JSON的设计。)

Answer 1:

浮现在脑海中的数据结构是一个区间树。 我还没有尝试过这个库,但它可能会帮助- 区间树 。

否则,至少你可以跳过最后一步,只是通过日破发事件。 积累是什么crossfilter是伟大的-使用reduceSum



文章来源: Splitting and grouping records into daily sets using d3.js and dc.js