R: 转换不规则时间字符串

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

相同的格式对我很重要,因为我之后想要操作这两个时间序列。例如:对齐时间序列、计算差异等等...

感谢您的帮助!

更新:添加dput

这两个数据集都非常长,所以我尝试缩小它们。

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

1
请提供这两个数据集的dput - Jonas Tundo
日期时间必须包含日期和时间,这就是为什么今天的日期被添加到 ts1 中的原因。ts2NA,因为您格式指定不正确。%Z 仅用于输出,您可能想使用 %z;但 %z 仅包括与 UTC 的有符号偏移量(它不包括文本时区表示),因此您需要在格式中包含文本。例如:strptime(ts2$t, "%a %b %d %Y %H:%M:%S GMT%z") - Joshua Ulrich
谢谢,但使用“strptime(ts2 $ t,“%a%b%d%Y%H:%M:%S GMT%z”)”我也得到了一个“NA”。任何想法为什么? - Markus Germar
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 <- 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小时的总间隔时。

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"

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接