2011-06-15 107 views
0

我一次又一次地遇到这个问题;检索并绘制数据随着时间的推移

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

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

工具 我通常与MySQL和PHP的工作,最常见的数据粘贴到Excel中绘制图表等

解决方法 截至这一刻我通常会创建一个Excel工作表,并把在手动计时并在数据集上用SumIf确定适当的结果数量。 虽然这对我来说似乎有点愚蠢,但在处理大量记录时(excel真的非常缓慢地减速)并不可行。

我真的很好奇,看看是否没有“真正的”和更好的解决方案来做到这一点,也许已经在构建查询?

回答

2

是在你的excel日期看起来像日期,或格式化显示为日期,日期序号数据文本?

如果日期数据点是日期序号那么情节将空间中的X轴均匀地随着时间的推移而不管各个数据点

所附图像demontrates之间间隔的:第一列和情节是“日期”的存储为文本,第二个日期序列号格式为日期

Demo of Plot

+0

我知道这应该如何工作,但不知何故,我最终更多的时间格式化日期比我想要的:P – Chrisvdberge 2011-06-15 11:12:29

0

使用PHP,我会做这样的事情(假设DB-结果是$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空日期。

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); 
    } 
+0

仍然感觉有点像一个解决办法,但我喜欢这个主意。要试试这个,thx! :) – Chrisvdberge 2011-06-15 11:11:33

相关问题