使用d3.js和dc.js将记录拆分并分组到每日集合中

时间:2014-07-23 09:32:46

标签: d3.js dc.js crossfilter

我是d3.jsdc.js的新手,我花了大部分时间阅读tutorialsAPI。它有一个相对陡峭的学习曲线,但我(慢慢)熟悉个体操作。那说我仍然缺乏构建我需要的实践经验。

我有一个包含以下数据结构的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设计。)

1 个答案:

答案 0 :(得分:1)

想到的数据结构是间隔树。我没有尝试过这个库,但它可能有所帮助 - interval tree

否则,至少你可以跳过最后一步,只是按天打破事件。积累是crossfilter擅长的 - 使用reduceSum