as.character.POSIXt

时间:2018-08-09 06:15:44

标签: r rounding posixct

有人可以向我解释一下这里发生了什么吗?这是R中的错误还是预期的行为?

首先,我创建一个POSIXct序列,其步长为0.1秒:

options(digits.secs = 6, digits = 6)
test <- as.POSIXct("2018-08-31 14:15:16.000000")
test_seq <- seq(test, test + 1, by = 1/10)

使用毫秒转换规范调用format可以得到预期的结果(即使存在很小的表示错误)

## this works as intended
format(test_seq, "%F %T.%OS")

给出输出:

 [1] "2018-08-31 14:15:16.16.000000" "2018-08-31 14:15:16.16.099999" "2018-08-31 14:15:16.16.200000" "2018-08-31 14:15:16.16.299999"
 [5] "2018-08-31 14:15:16.16.400000" "2018-08-31 14:15:16.16.500000" "2018-08-31 14:15:16.16.599999" "2018-08-31 14:15:16.16.700000"
 [9] "2018-08-31 14:15:16.16.799999" "2018-08-31 14:15:16.16.900000" "2018-08-31 14:15:17.17.000000"

但是,如果我使用as.character,则毫秒数似乎只是在一位数字之后才截止(即使我在digits.secs = 6中指定了options)。由于此行为和错误表示错误,导致结果字符串不正确:

as.character(test_seq)

提供输出(请注意,每两个字符串都相等):

 [1] "2018-08-31 14:15:16.0" "2018-08-31 14:15:16.0" "2018-08-31 14:15:16.2" "2018-08-31 14:15:16.2" "2018-08-31 14:15:16.4" "2018-08-31 14:15:16.5"
 [7] "2018-08-31 14:15:16.5" "2018-08-31 14:15:16.7" "2018-08-31 14:15:16.7" "2018-08-31 14:15:16.9" "2018-08-31 14:15:17.0"

为进一步说明:

as.character(as.POSIXct("2018-08-31 14:15:16.123456"))

正确显示所有毫秒数字(不会截断)。因此,我认为在前一种情况下,它决定只有一个有效的毫秒数字(正确),然后将结果切掉一位数字(由于错误的表示是不正确的)

1 个答案:

答案 0 :(得分:0)

as.character.POSIXt带有一个format=参数。

如果您不使用format=进行调用,则会得到默认值,该默认值将缩短至十分之一秒(由于有效数字,根据您的编辑)。相反,请尝试:

as.character(test_seq, format = "%F %T.%OS")
#[1] "2018-08-31 14:15:16.16.000000" "2018-08-31 14:15:16.16.099999" ...

实际上,as.character.POSIXt()只是format()的包装

as.character.POSIXt
#function (x, ...) 
#format(x, ...)
#<environment: namespace:base>

所以format(test_seq)将为您提供与as.character(test_seq) sans 格式相同的内容。