2012-01-23 3 views
0

У меня есть входные данные, которые состоят из списка идентификаторов объекта и двух категорий, а также значений в реальном времени и двух значений. В реальном времени и значения для каждого идентификатора могут иметь разную длину. В файле есть несколько идентификаторов и несколько категорий для каждого идентификатора.Форматирование по временной шкале до интервала

У меня возникли проблемы с поиском хорошего инструмента для внесения изменений в файл данных. Я использую PostgreSQL для извлечения данных, а R для анализа не может найти хорошую функцию для того, чтобы помочь. Есть предположения? Я, по сути, хочу сделать в реальном времени 30-минутные интервалы, а не временные метки, и использовать их в качестве моих атрибутов и значения из V1 в качестве фактических значений. Но сначала я должен получить категории временных интервалов в свои данные.

Вход:

ID CAT1 CAT2 realtime  V1 
21 23  51  11/2/3138 18:29 135 
21 23  51  11/2/3138 18:58 132 
21 23  51  11/2/3138 21:05 129 
21 23  51  11/2/3138 21:05 130 
21 23  51  11/2/3138 22:53 142 
71 23  52  11/4/3138 6:47 66 
71 23  52  11/4/3138 8:45 69 
71 23  52  11/4/3138 8:45 68 

Выход:

ID || CAT1 || CAT2 || Interval 0 || Interval 1 || Interval 2 || Interval 3 || ... 
21 || 21 || 23 || 135  || 132  || 130  || 142  || ... 
71 || 23 || 52 || 66   || 69   || 68   || NULL  || ... 

Я также написал кое-что о конкатенации данных, который не показан, чтобы быть очень полезным, но если вы не согласны, пожалуйста, дайте мне знать: Perl + PostgreSQL-- Selective Column to Row Transpose

EDIT :: Я был бы открыт для использования Weka или Matlab, если это существует, или скриптовый язык, чтобы понять это, но я надеюсь, что есть функция/pa ckage где-то там ...

+0

3138? Вы уверены, что? –

+0

Это данные общественного здравоохранения, поэтому он дает мусорные годы. Поскольку меня интересуют только временные интервалы, нам не нужно сосредотачиваться на этом. –

ответ

1

Вы просто преобразуете строки «реального времени» в фактическое время, а затем оттуда, например. путем деления длительности интервала:

d$interval = floor(as.numeric(strptime(d$realtime,"%m/%d/%Y %H:%M"))/1800) 

если вы хотите буквально переменная с «Интервал х» просто добавить

d$interval = paste("Interval", d$interval - min(d$interval)) 

и создать длинный формат из этого, используйте reshape:

reshape(d[,names(d) != 'realtime'],idvar=c("ID","CAT1","CAT2"),timevar="interval",direction="wide") 

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

+0

Извините, только что понял, что я никогда не принимал! –

0

Для установки временных меток в таблице PostgreSQL в нестандартном формате вы можете использовать функцию to_timestamp().
Пример:

SELECT to_timestamp('11/2/3138 18:29', 'MM/DD/YYYY hh24:mi') 

Результат (отображение в формате ISO 8601):

3138-11-02 18:29:00+01 

Чтобы укоротить временные метки получасовой точности, вы можете использовать функции date_trunc() и date_part() or extract().
Пример:

SELECT date_trunc('hour', now()) 
    + CASE WHEN extract(minute from now()) > 29 THEN 30 
             ELSE 0 END * interval '1 min' 
+0

Этот date_trunc - это то, чего я раньше не знал, спасибо.Мне было интересно, есть ли у вас мысли о том, как создавать атрибуты интервала 0 (первая временная метка), интервал 1, интервал 2 и т. Д., Где интервалы измеряются относительно интервала 0? –

+0

@LillianMilagrosCarrasquillo: Я не уверен, что понимаю ваш вопрос. Я предлагаю вам открыть другой вопрос и включить примеры того, что у вас есть, и то, что вы хотите получить точно. –

+0

Благодарим вас за ввод! У меня есть realtimes, как указано выше, и вы хотите вместо этого иметь интервалы. Для каждого уникального ID/Cat1/Cat2 я хочу иметь первый раз как «Интервал 0» и определять интервал 1 как следующий realtime1 - realtime 2. –

Смежные вопросы