извлечение и отображение данных с течением времени - PullRequest
0 голосов
/ 15 июня 2011

Я сталкиваюсь с этой проблемой снова и снова;

Ситуация существует (большой) набор данных с записями, привязанными к дате (или даже времени), и мне нужно построить графикэти данные со временем.

Проблема Набор данных содержит только даты, для которых есть доступные записи (очевидно), но мне также нужны «пустые» даты, чтобы иметь возможность равномерно строить несколько рядов с течением времени.

Инструменты Обычно я работаю с MySQL и PHP, чаще всего вставляя данные в Excel для построения графиков и т. Д.

Обходной путь До этого моментаЯ обычно создаю таблицу Excel и помещаю даты вручную и определяю подходящее количество результатов с помощью SumIf в наборе данных.Это кажется мне немного глупым и не очень работоспособным при работе с большим количеством записей (Excel действительно очень медленно работает очень быстро).

Мне действительно любопытно узнать, не существует ли «реального» и лучшего решения для этого, может быть, уже при создании запроса?

Ответы [ 3 ]

2 голосов
/ 15 июня 2011

Являются ли даты в вашем тексте данных Excel похожими на даты, или серийные номера дат отформатированы для отображения в виде дат?

Если точки данных даты являются порядковыми номерами даты, то график будет равномерно распределяться по оси X во времени независимо от интервала между отдельными точками данных

Прикрепленное изображение демонстрирует: в первом столбце и графике «Даты» хранятся в виде текста, а порядковые номера второй даты отформатированы как даты

Demo of Plot

1 голос
/ 15 июня 2011

Одним из очевидных решений было бы создать таблицу, содержащую каждую дату в диапазоне, и выбрать свои данные, оставленные присоединенными к этому:

  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 (но я думаю,код довольно некорректен):

  // 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 голосов
/ 15 июня 2011

Используя 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...