我发现一些我无法解释的奇怪行为as.POSIXlt
,我希望其他人可以。在调查这个问题时,我发现有时一秒的小数部分会被错误地舍入
例如,下面的数字表示自纪元开始以来的特定秒,最后 6 位数字是秒的小数部分,因此第一个数字上的秒小数应该是 0.645990。
# Generate sequence of integers to represent date/times
times <- seq( 1366039619645990 , length.out = 11 )
options(scipen=20)
times
[1] 1366039619645990 1366039619645991 1366039619645992 1366039619645993 1366039619645994 1366039619645995
[7] 1366039619645996 1366039619645997 1366039619645998 1366039619645999 1366039619646000
# Convert to date/time with microseconds
options(digits.secs = 6 )
as.POSIXlt( times/1e6, tz="EST", origin="1970-01-01") + 5e-7
[1] "2013-04-15 10:26:59.645990 EST" "2013-04-15 10:26:59.645991 EST" "2013-04-15 10:26:59.645992 EST"
[4] "2013-04-15 10:26:59.645993 EST" "2013-04-15 10:26:59.645994 EST" "2013-04-15 10:26:59.645995 EST"
[7] "2013-04-15 10:26:59.645996 EST" "2013-04-15 10:26:59.645997 EST" "2013-04-15 10:26:59.645998 EST"
[10] "2013-04-15 10:26:59.645999 EST" "2013-04-15 10:26:59.646000 EST"
我发现我必须添加一个小的增量,等于最小时间变化的一半,才能正确表示一秒的小数部分,否则会出现舍入错误。如果我在上面的一系列数字上运行它就可以正常工作as.POSIXlt
,但是如果我尝试转换一个数字,即应该以 .645999 结尾的数字,那么将截断为 .645 的数字,我不知道为什么!
# Now just convert the date/time that should end in .645999
as.POSIXlt( times[10]/1e6, tz="EST", origin="1970-01-01") + 5e-7
[1] "2013-04-15 10:26:59.645 EST"
将返回的向量中的第 10 个元素as.POSIXlt
与上面等效的单个元素进行比较。怎么了?
会话信息:
R version 2.15.2 (2012-10-26)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] raster_2.0-41 sp_1.0-5
loaded via a namespace (and not attached):
[1] grid_2.15.2 lattice_0.20-13 tools_2.15.2