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

时间:2013-05-23 10:47:05

标签: string r time time-series

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

时代系列看起来像这样:

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

2 个答案:

答案 0 :(得分: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小时的总差距时。

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

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

但是,您的语言环境实际上也可能需要逗号作为小数分隔符,在这种情况下,您可能会发现小数秒实际上已经存在,但是当您只是查看时间结构时它们就不会显示(请参阅上面标有 * *的行,其中不显示小数部分。)