随着时间的推移检索和绘制数据

时间:2011-06-15 07:53:15

标签: php mysql excel data-visualization

我一次又一次地遇到这个问题;

场合 有一个(大)数据集,其记录与日期(甚至时间)相关联,我需要随时间绘制这些数据。

问题 数据集只包含有可用记录的日期(显然),但我还需要“空”'日期能够随着时间的推移均匀地绘制多个系列。

工具 我通常使用MySQL和PHP,最常将数据粘贴到Excel中以绘制图形等。

解决方法 到目前为止,我通常会创建一个excel表并手动输入日期,并使用数据集上的SumIf确定适当的结果数。 这对我来说似乎有点愚蠢,并且在处理大量记录时并不是真的可行(excel非常快速地变得非常慢)。

我真的很好奇,看看有没有真实的'更好的解决方案,可能已经在构建查询?

3 个答案:

答案 0 :(得分:2)

您的日期是否优于看起来像日期的数据文本,或格式化为日期的日期序列号?

如果日期数据点是日期序列号,那么无论各个数据点之间的间隔如何,该图都将使X轴均匀分布

附图反映:第一列和图是“日期”存储为文本,第二个日期序列号格式化为日期

Demo of Plot

答案 1 :(得分:1)

一个明显的解决方案是创建一个包含该范围内每个日期的表格,并选择与此相关的数据:

  CREATE TABLE days ( day DATE NOT NULL, PRIMARY KEY day );
  INSERT INTO days (day) VALUES (20110101);
  INSERT INTO days (day) VALUES (20110102);
  ....
  SELECT days.day, yourtable.*
  FROM days LEFT JOIN yourtable
     ON days.day=yourtable.day;

或者你可以使用PHP注入缺少的日子(但我认为jupaju的代码存在相当缺陷):

  // ensure your qry returns DATE_FORMAT(day, '%Y-%m-%d') AS day
  $lastday='';
  while ($r=mysql_fetch_assoc($qry_result)) {
      if (!$lastday) $lastday=$r['day'];
      while ($r['day']>$lastday) {
          print $lastday . "\n";
          $lastday=add_day($lastday);
      }
      unset($r['day']);
      print $lastday . ',' . implode(',', $r) . "\n";
  }

  function add_day($day)
  {
     list($yr, $mo, $da)=explode('-',$day);
     $t=mktime(4,0,0,$mo, $da, $yr)+24*60*60; // NB not all days are 24 hours
     return date('Y-m-d',$t);
  }

答案 2 :(得分:0)

使用PHP我会做这样的事情(假设db-results在$res中,日期为Y-m-d为关键字):

$year = date('Y');
for ($month = 1; $month <= 12; $month++) {
    $last_day = date('t', mktime(0, 0, 0, 1, $month, $year));
    for ($day = 1; $day <= $last_day; $day++) {
        $key = sprintf('%4d-%02d-%02d', $year, $month, $day);
        if (!empty($res[$key])) {
            $output[$key] = $res[$key];
        } else {
            $output[$key] = 0;
        }
    }
}

这样你就会得到一个数组$output,其空白日期的值为0