Форматирование до меток времени с интервалом - PullRequest
0 голосов
/ 24 января 2012

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

У меня возникли проблемы с поиском хорошего инструмента для внесения изменений в файл данных. Я использую 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-- Выборочная перестановка столбцов в строки

РЕДАКТИРОВАТЬ :: Я был бы открыт для использования Weka или Matlab, если это существует - или языка сценариев, чтобы выяснить это, но я надеюсь, что где-то там есть функция / пакет ...

Ответы [ 2 ]

1 голос
/ 24 января 2012

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

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

если вы хотите буквально переменную с "Interval x", просто добавьте

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 голосов
/ 24 января 2012

Чтобы вставить метки времени в таблицу 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()или extract().
Пример:

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