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

我一再遇到这个问题;

情况是有一个(大)数据集与logging绑定date(甚至时间),我有需要绘制这些数据随着时间的推移。

问题数据集只包含有logging可用的date(显然),但是我还需要“空”date以便随时间平均地绘制多个系列。

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

解决方法到目前为止,我通常会创build一个Excel工作表并手动inputdate,并使用数据集上的SumIf来确定适当的结果数量。 这对我来说似乎有些愚蠢,而且在处理大量logging时(excel真的非常慢),并不是很有效。

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

在你的dateexcel数据文本看起来像date,或date序列号格式化显示为date?

如果date数据点是date序列号,那么无论单个数据点之间的间隔如何,绘图将均匀地放置X轴

附加的图像demontrates:第一列和情节是“date”存储为文本,第二个date序列号格式化为date

剧情演示

一个显而易见的解决scheme是创build一个包含范围内的每个date的表格,并select你的数据join到这个:

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注入缺less的日子(但我认为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('Ym-d',$t); } 

使用PHP我会做这样的事情(假设数据库结果在$res有date作为Ymd键):

 $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空值为0date。