有人可以向我解释一下这里发生了什么吗?这是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"))
正确显示所有毫秒数字(不会截断)。因此,我认为在前一种情况下,它决定只有一个有效的毫秒数字(正确),然后将结果切掉一位数字(由于错误的表示是不正确的)
答案 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 格式相同的内容。