【问题标题】:Date-Time Conversion in R with fractional secondsR中的日期时间转换,带小数秒
【发布时间】:2013-04-01 03:46:26
【问题描述】:

如何转换字符串

t <- c("00:00:0.00", "00:00:0.34")

变成一个数字? 尝试了几种方法 - 但都没有奏效..

【问题讨论】:

  • 您可以先转换为任意日期或使用lubridate...
  • 如何转换为日期/数字实际上是我的问题..

标签: r date time


【解决方案1】:

基本思想是将您的字符串转换为有效的POSIX*t 对象,然后将其转换为numeric 值:

## Set a couple of printing options
options(digits = 12)
options(digits.secs = 3)

## Convert from character to POSIXlt to numeric
(a <- strptime(t, format="%H:%M:%OS", tz="GMT"))
# [1] "2013-04-09 00:00:00.00 GMT" "2013-04-09 00:00:00.34 GMT"
(b <- as.numeric(a))
# [1] 1365465600.00 1365465600.34

请注意,当从数字转换回POSIX*t 时,会出现浮点问题,这些问题会改变这些对象的打印方式。 (See here for more discussion of that issue.)

## It _looks_ like you've lost 1/100 second on the second time object
(c <- as.POSIXct(as.numeric(b), origin = "1970-01-01", tz="GMT"))
# [1] "2013-04-09 00:00:00.00 GMT" "2013-04-09 00:00:00.33 GMT"

## Here's a workaround for nicer printing.
as.POSIXct(as.numeric(b+1e-6), origin = "1970-01-01", tz="GMT")
# [1] "2013-04-09 00:00:00.00 GMT" "2013-04-09 00:00:00.34 GMT"

【讨论】:

  • +1 如果你不介意我问,额外括号的动机是什么?
  • @MatthewPlourde -- 他们只是强制打印一个对象的值,即使它被分配给一个符号。 (比较 x &lt;- rnorm(5)(x &lt;- rnorm(5))。我把它们放在那里 b/c 我通常希望我的答案是独立的并且可以通过将它们从 SO 复制并粘贴到 R 会话中来运行,尽管我可以看到它们是有点分心;)
  • 完全没有批评。问是因为我希望学到一些东西……我做到了!谢谢。
  • @MatthewPlourde 没问题。我没有把它当作批评,回想起自己曾经想过同样的事情,回到时间的迷雾中......
  • @JoshO'Brien:当“完整”秒数大于零时,"%S%OS" 部分给我带来了麻烦——但"%OS" 有效。我知道"%OS" 匹配秒的整数和小数部分。
猜你喜欢
  • 2018-04-04
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多