【问题标题】:Convert a Date to nanoseconds in R [closed]在R中将日期转换为纳秒[关闭]
【发布时间】:2016-07-01 18:21:08
【问题描述】:

我正在尝试将日期转换为 R 中的纳秒。我尝试使用 lubridate 包但没有成功。

日期

感谢任何帮助!

谢谢。

【问题讨论】:

  • 你到底是什么意思?日期是一个固定的时间点。纳秒意味着 2 个时间点之间的某种测量,不是吗?你想要从那个日期开始的纳秒吗?顺便说一句,您最好展示您之前的尝试,而不是仅仅说您尝试过某事。它通常对想要帮助你的人很有帮助。
  • 另外一点是,R 使用系统函数来完成它的一些日期时间工作,我知道没有系统可以以纳秒精度存储日期时间。毫秒精度通常是你得到的,因为那是 POSIX 时间级别的精度..
  • 你想要纳秒的数量,但是从什么时候开始?此外,由于您需要纳秒级精度,因此理论上您提供的日期应该提供相同的精度。
  • 很抱歉之前没有添加所有详细信息。我们正在尝试将我的预测脚本的输出注入到 Influx DB 中,这是一个时间序列数据库。它查找与“1970-01-01”的纳秒差异并识别日期。我正在查看从 1970-01-01 到 2016-06-29 的日期差异,以纳秒为单位。

标签: r datetime lubridate


【解决方案1】:

使用microbenchmark 包。该包返回执行某项精确度所需的时间的基准。在包内,它们有一个函数,可以返回当前时间(以纳秒为单位)

microbenchmark::get_nanotime()
[1] 3.610932e+14
microbenchmark::get_nanotime()
[1] 3.610952e+14
microbenchmark::get_nanotime()
[1] 3.610958e+14
microbenchmark::get_nanotime()
[1] 3.610963e+14

或者,如果精度变得不那么重要,您可以使用

as.numeric(as.POSIXct(TIMEA)) - as.numeric(as.POSIXct(TIMEB))

【讨论】:

  • 我知道这与 OP 的评论有关,但它实际上并没有回答官方问题。顺便说一句,beomes 是什么意思?
【解决方案2】:

设置:

require(lubridate)
dateval  <- c("2016-06-29")
dateeval <- ymd(dateval)

纳秒是国际单位制的时间单位,等于十亿分之一秒。

纪元与该日期之间的时间差异(以纳秒为单位)(由于日期没有时间戳,因此约为):

difftime(dateeval, Sys.time(), units = "secs")
abs(as.numeric(difftime(ymd("1970-01-01"),dateeval, units = "secs")))*1000000000
[1] 1.467158e+18

【讨论】:

  • 这是错误的,因为 POSIXct 仅精确到大约 1.1 微秒。您可以任意乘以,但最后四位数字将是 double 中 53 位精度的垃圾。
  • @DirkEddelbuettel 认为答案很清楚,这是一个近似值,因为无论如何都没有日期的时间戳
  • 不是这样。 nanotime package 实际上可以回答这个问题,因为它超出了 POSIXct 分辨率。有了它,我可以通过nanotime(Sys.time()) - nanotime(Sys.Date()) 获得正确的(以integer64 分辨率)和精确 自午夜以来的纳秒。这里没有近似值。从这个意义上说,正如我所说,你的答案是错误的,尽管你的说法是正确的。 (由于本地与 utc 的差异也逐渐出现,存在一个剩余的错误,但这是一个我们可以轻松解决的参数化问题。)
  • 一旦我们通过Sys.setenv("TZ"="UTC") 进行简化,它就可以工作。然后Sys.time() - as.POSIXct(Sys.Date()) 给我一个来自difftime() 的格式很好的结果。并且使用nanotime() 的工作方式相同,缩放:(nanotime(Sys.time()) - nanotime(Sys.Date()))/(1e9*3600)
猜你喜欢
  • 1970-01-01
  • 2021-10-23
  • 2017-10-17
  • 2012-12-09
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
相关资源
最近更新 更多