【问题标题】:R rounding issue on fractional seconds小数秒的 R 舍入问题
【发布时间】:2018-07-19 06:52:18
【问题描述】:

我正在尝试为以 10Hz 的频率(即 0.1 秒的周期)采样的时间序列创建一个序列

以下this post我用过:

> options(digits.secs=4)

然后:

> time.seq = seq(from=as.POSIXlt("00:00:00.0", format="%H:%M:%OS",tz="GMT"),                   length.out=10, by=0.10)

返回:

> head(time.seq)
[1] "2018-02-08 00:00:00.0 GMT" "2018-02-08 00:00:00.0 GMT"
[3] "2018-02-08 00:00:00.2 GMT" "2018-02-08 00:00:00.2 GMT"
[5] "2018-02-08 00:00:00.4 GMT" "2018-02-08 00:00:00.5 GMT"

这是不对的。 2 应该是:

"2018-02-08 00:00:00.1 GMT"

和[4]

"2018-02-08 00:00:00.3 GMT"

最初我认为问题出在格式化或 getOption 上,但似乎并非如此,因为如果我使用不同的分数,它可以完美地工作:

> time.seq = seq(from=as.POSIXlt("00:00:00.0", format="%H:%M:%OS",tz="GMT"),                   length.out=10, by=0.0315)
> head(time.seq)
[1] "2018-02-08 00:00:00.0000 GMT" "2018-02-08 00:00:00.0315 GMT"
[3] "2018-02-08 00:00:00.0629 GMT" "2018-02-08 00:00:00.0945 GMT"
[5] "2018-02-08 00:00:00.1259 GMT" "2018-02-08 00:00:00.1575 GMT"

所以这意味着存在一些舍入误差。

请问有人知道如何解决这个问题吗?我在 OS X (High Sierra) 上使用 R 3.4.1

谢谢!

更新 从this post 可以看出,加法中有一个浮点错误。使用 Matthew Lundberg 的帖子中的“表单”格式化功能,我得到:

f4 <- "%Y-%m-%d %H:%M:%OS4"
> time.seq = seq(from=as.POSIXlt("00:00:00.0", format="%H:%M:%OS",tz="GMT"),                   length.out=10, by=0.10)
> format(time.seq[1], f4)
[1] "2018-02-09 00:00:00.0000"
> format(time.seq[2], f4)
[1] "2018-02-09 00:00:00.0999"
> format(time.seq[3], f4)
[1] "2018-02-09 00:00:00.2000"

这大概意味着由于某种原因,R 中的格式没有选择我的选项设置:

> options(digits.secs=4)

【问题讨论】:

标签: r time sequence


【解决方案1】:

确实有不一致的地方

  • format.POSIXlt(也被print.POSIXlt调用)确定必要的相关数字的数量(将getOption("digits.secs")视为最大值,但是在您的情况下,相关数字仅为 1,因为 .099999 四舍五入仍为 .1000)

  • format.POSIXlt 调用的内部代码为.Internal(format.POSIXlt(x, format, usetz)),它可能只是削减(或楼层?)到确定的相关位数,而实际上没有以相同的方式舍入


编辑:
有时间查看链接的帖子how-r-formats-posixct-with-fractional-seconds,我想那里已经说过/讨论了所有其他内容,特别是,如果你达到 60 秒,四舍五入可能会更复杂,这可能是事情如此的主要原因他们是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多