5

我有两个来自不同数据帧的不同时间序列,具有不同的不规则格式,但问题是一样的。我只想提取小时、分钟、秒和毫秒。

时间序列如下所示:

ts1

08:27:23,445
08:27:24,280
08:27:25,115
...

我试过了

strptime("08:27:23,445", "%H:%M:%OS")
[1] "2013-05-23 08:27:23"

我丢失了毫秒信息并获得了无用的(对我而言)日期信息。

ts2

Fri Apr 19 2013 08:39:41 GMT+0200
Fri Apr 19 2013 08:39:43 GMT+0200
Fri Apr 19 2013 08:39:45 GMT+0200
...

我试过了

strptime("Fri Apr 19 2013 08:39:41 GMT+0200", "%a %b %d %Y %H:%M:%S %Z")
[1] NA

最后,我想将 ts1 和 ts2 分别转换为具有相同格式(以毫秒为单位)的新时间序列,例如:

ts1

08:27:23,445

ts2

08:39:41,000

相同的格式对我来说很重要,因为稍后我想对这两个时间序列进行操作。例如:匹配时间序列,计算差异等......

谢谢您的帮助!

更新:添加输入

这两个数据集都非常长,这就是我试图减少它们的原因。

ts1

structure(list(t = structure(1:9, .Label = c("08:27:23,445", 
                                                   "08:27:24,280", "08:27:25,115", "08:27:25,960", "08:27:26,780", 
                                                   "08:27:27,540", "08:27:28,295", "08:27:29,075", "08:27:29,910"), class = "factor")), .Names = "t", row.names = c(NA, -9L
                                                   ), class = "data.frame")

ts2

structure(list(t = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 6L, 7L, 
                           8L), .Label = c("Fri Apr 19 2013 08:39:41 GMT+0200", "Fri Apr 19 2013 08:39:43 GMT+0200", 
                                           "Fri Apr 19 2013 08:39:45 GMT+0200", "Fri Apr 19 2013 08:39:49 GMT+0200", 
                                           "Fri Apr 19 2013 08:39:51 GMT+0200", "Fri Apr 19 2013 08:39:53 GMT+0200", 
                                           "Fri Apr 19 2013 08:39:59 GMT+0200", "Fri Apr 19 2013 08:40:05 GMT+0200", 
                                           "Fri Apr 19 2013 08:40:06 GMT+0200"
                           ), class = "factor")), .Names = "t", row.names = c(NA, -9L), class = "data.frame")
4

2 回答 2

1

如果您有一个设置为零的点,下面是一个可能会有所帮助的快速 lapply 功能。例如,如果您只想比较同一天从 0:00(午夜)到 23:59:99,999 的活动。如果是这样,您可以将时间转换为另一种形式(在我的示例中为分钟),您可以查看单个活动需要多长时间。

将您的示例用于 t1:

制作时间向量(作为字符)

time <- c("08:27:23,445",
          "08:27:24,280",
          "08:27:25,115")

将逗号更改为冒号,以便于剥离

time.new <- gsub(",", ":", time)

计算小数分钟

time.mins <- sapply(strsplit(as.character(time.new), ":"),
                    function(x) {
                      x<-as.numeric(x)
                      (x[1]*60+x[2]+(x[3]/60)+(x[4]/60000))
                    })

如果您对列进行 df,结果如下所示:

> df <- cbind(time, time.mins)
> df
     time           time.mins         
[1,] "08:27:23,445" "507.39075"       
[2,] "08:27:24,280" "507.404666666667"
[3,] "08:27:25,115" "507.418583333333"

我想这可能对点击率之类的东西更有帮助,或者当你不关心超过 24 小时的总差距时。

于 2013-05-31T03:19:23.647 回答
0

我认为让 %OS 说明符起作用的关键可能是将“,”转换为“。” 作为小数分隔符。以下对我有用:

> ts1 = data.frame(t = c("08:27:23,445", "08:27:24,280", "08:27:25,115",
+                        "08:27:25,960", "08:27:26,780", "08:27:27,540",
+                        "08:27:28,295", "08:27:29,075", "08:27:29,910"),  
+                  stringsAsFactors = FALSE)
> 
> ts1$t = sub(",", ".", ts1$t)
> 
> T = apply(ts1, 1, function(n) {(strptime(n, format = "%H:%M:%OS"))})
> 
> T[[1]]                               # ****
                    t 
"2013-12-22 08:27:23" 
> sprintf("%.3f", T[[1]])
[1] "1387693643.445"

在这里您可以看到,如果您将时间结构转换为数字,那么小数秒肯定存在!

但是,也有可能您的语言环境实际上期望逗号作为小数分隔符,在这种情况下,您很可能会发现小数秒实际上已经存在,但当您仅查看时间结构时并未显示(参见上面的行标记为* * 的地方不显示小数部分)。

于 2013-12-22T14:53:09.610 回答