【问题标题】:Formatting to Timestamps to Interval格式化为时间戳到间隔
【发布时间】:2012-02-17 05:19:06
【问题描述】:

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

我很难找到一个好的工具来对数据文件进行这种更改。我正在使用 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

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

【问题讨论】:

  • 3138?你确定吗?
  • 这是公共卫生数据,所以它给了垃圾年。因为我只对时间间隔感兴趣,所以我们不需要关注它。

标签: r postgresql matlab time weka


【解决方案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")

但是,请注意,如果出现重复,默认值是采用第一个匹配值,而在您的示例中,我认为您使用的是最后一个,因此您可能希望反转数据的顺序,如果这是案例。

【讨论】:

    【解决方案2】:

    要以非标准格式在 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'
    

    【讨论】:

    • 这个 date_trunc 是我以前不知道的,谢谢。我想知道您是否对如何创建间隔 0(第一个时间戳)、间隔 1、间隔 2 等的属性有任何想法,其中间隔是相对于间隔 0 测量的?
    • @LillianMilagrosCarrasquillo:我不确定我是否理解你的问题。我建议您打开另一个问题,并包括您拥有什么以及您想要获得什么的示例。
    • 感谢您的意见!如上所述,我有实时,并且想要有间隔。对于每个唯一的 ID/Cat1/Cat2,我希望第一次作为“间隔 0”并将间隔 1 定义为下一个实时 1 - 实时 2。
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    相关资源
    最近更新 更多