d3.time / crossfilter天被一个人关闭

时间:2017-02-15 05:10:00

标签: d3.js dc.js crossfilter

我一直在尝试创建一个dc.js行图,显示每天的统计信息,我的维度和群组

  var dayNameFormat = d3.time.format("%A");
  var weekDayFormat = d3.time.format('%w'); //weekday as a decimal number [0(Sunday),6].

  var dayOfWeek = ndx.dimension(function(d) {
    return weekDayFormat(d.date) + '.' + dayNameFormat(d.date);
  });

  var dayOfWeekGroup = dayOfWeek.group().reduce(
    function(p, d) {
      ++p.count;
      p.totalPoints += +d.points_per_date;
      p.averagePoints = (p.totalPoints / p.count);
      if (d.student_name in p.studentNames) {
        p.studentNames[d.student_name] += 1
      } else {
        p.studentNames[d.student_name] = 1;
        p.studentCount++;
      }
      return p;
    },
    function(p, d) {
      --p.count;
      p.totalPoints -= +d.points_per_date;
      p.averagePoints = (p.totalPoints / p.count);
      if (p.studentNames[d.student_name] === 0) {
        delete p.studentNames[d.student_name];
        p.studentCount--;
      }
      return p;
    },
    function() {
      return {
        count: 0,
        totalPoints: 0,
        averagePoints: 0,
        studentNames: {},
        studentCount: 0
      };
    });

和图表

  dayOfWeekChart
    .width(250)
    .height(180)
    .margins({
      top: 20,
      left: 20,
      right: 10,
      bottom: 20
    })
    .dimension(dayOfWeek)
    .group(dayOfWeekGroup)
    .valueAccessor(function(d) {
      return d.value.totalPoints
    })
    .renderLabel(true)
    .label(function(d) {
      return d.key.split('.')[1] + '(' + d.value.totalPoints + ' points)';
    })
    .renderTitle(true)
    .title(function(d) {
      return d.key.split('.')[1];
    })
    .elasticX(true);

我希望结果与我的数据库查询匹配

enter image description here

总价值是正确的,但天数已被一天抵消(星期日有星期一的总数)

enter image description here

我的小提琴https://jsfiddle.net/santoshsewlal/txrLw9Lc/ 我一直在努力做到这一点,任何帮助都会很棒。 感谢

1 个答案:

答案 0 :(得分:0)

似乎是UTC日期/时间问题。处理来自多个时区的数据总是令人困惑!

你所有的时间戳都非常接近第二天 - 它们的时间戳都是22:00。所以它取决于时区应该被解释为哪一天。我想你可能在东半球,当你在电子表格中阅读它们时,这些时间戳增加了几个小时?

您正在使用substr

来缩短时间
d.date = dateFormat.parse(d.activity_date.substr(0, 10));

我建议尝试解析整个时间:

  var dateFormat = d3.time.format('%Y-%m-%dT%H:%M:%S.%LZ');
  data.forEach(function(d, i) {
    d.index = i;
    d.date = dateFormat.parse(d.activity_date);

但是,我不是时区专家所以我不能保证任何事情。只是指出问题可能存在的地方。