格式化为时间戳到间隔

时间:2012-01-23 21:19:21

标签: r postgresql matlab time weka

我输入的数据包括主题ID列表和2个类别,以及实时和两个值。每个ID的实时值和值可以具有不同的长度。文件中有多个ID,每个ID有多个类别。

我在找到一个好的工具来更改数据文件时遇到了一些麻烦。我使用PostgreSQL提取数据和R进行分析,无法找到一个好的函数来帮助。有什么想法吗?我基本上想要将实时设置为30分钟而不是timesptamps,并将它们用作我的属性,将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

编辑::我愿意使用Weka或Matlab(如果存在) - 或者使用脚本语言来解决这个问题,但我希望在某处有一个函数/包...

2 个答案:

答案 0 :(得分:1)

您只需将“实时”字符串转换为实际时间,然后从那里开始工作,例如除以间隔长度:

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")

但请注意,默认情况下,如果是重复项,则采用第一个匹配值;而在您的示例中,我认为您使用的是最后一个,因此您可能希望颠倒数据的顺序,如果这是情况下。

答案 1 :(得分: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'