使用R将时间格式转换为数字

11

在大多数情况下,我们使用R语言将数值时间转换为POSIXct格式。但是,如果我们想要比较两个时间点,则更喜欢数值时间格式。例如,我有一个日期格式如“2001-03-13 10:31:00”,

  begin <- "2001-03-13 10:31:00"

使用R语言,我想将此转换为数字格式(例如儒略时间),可能是从1970-01-01 00:00:00到2001-03-13 10:31:00之间的秒数。你有什么建议吗?


儒略历始于公元前45年(罗马共和国建立709年)由朱利叶斯·凯撒改革罗马历而制定。它经过与亚历山大的天文学家索西根尼斯的商议后选择了这个日期,可能是为了近似于赤道年(至少自希帕克斯以来已知)。请参阅http://en.wikipedia.org/wiki/Julian_calendar


我没有点踩,但我怀疑这是因为你的输入和输出之间存在粗心的不匹配。看起来你可能希望仅仅删除字符类型向量中的标点符号,并且你想要: 20010313103100 可能作为一个数值,但目前还不清楚。 - IRTFM
你的回复很有帮助。我会修改问题。 - Frank Wang
5
一般来说,如果想把某个东西转换为数字,最好的第一选择是使用as.numeric。你试过了吗? - joran
良好的提醒。谢谢。 - Frank Wang
4个回答

14

如果你只想从字符向量中删除 ":" , " ", 以及 "-" ,那么这个方法就足够了:

end <- gsub("[: -]", "" , begin, perl=TRUE)
#> end
#[1] "20010313103100"

您应该阅读 ?regex 中关于字符类的一节,大约在文档的四分之一处。由于“-”在这种情况下作为范围运算符是特殊的,因此它需要放在首位或末尾。

在进行编辑之后,答案显然就是 @joran 所写的,除了您需要先转换为 DateTime 类:

 as.numeric(as.POSIXct(begin))
#[1] 984497460
另一个要指出的是比较运算符对于日期和时间类变量确实可行,因此转换可能根本不必要。这将“begin”与一秒钟后的时间进行比较,并正确地报告“begin”更早:
as.POSIXct(begin) < as.POSIXct(begin) +1
 #[1] TRUE

1
或者更一般地说,gsub("[^[:digit:]]", "", begin) 将删除除数字以外的任何内容。 - kohske

7
根据修订后的问题,以下内容应该符合您的要求:
begin <- "2001-03-13 10:31:00"
as.numeric(as.POSIXct(begin))

结果是一个unix时间戳,即自纪元以来的秒数,假设时间戳在本地时区。

3
也许这个也能起作用:
library(lubridate)
...
df <- '24:00:00'

as.numeric(hms(df))
函数将把您的数据从一种时间格式转换为另一种,这将使您能够将其转换为秒。请参阅完整文档
我尝试使用这个函数是因为我的数据格式超过了24小时。

2

?as.POSIX 帮助文档中的示例如下:

as.POSIXct(strptime(begin, "%Y-%m-%d %H:%M:%S"))

"所以对于你来说,这将是"
as.numeric(as.POSIXct(strptime(begin, "%Y-%m-%d %H:%M:%S")))

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