Ale*_*son 6 r strptime posixct posixlt
这个片段
options(digits.secs=3)
s<-"12:00:00.188"
fmt<-"%I:%M:%OS"
print(strptime(s,fmt))
print(as.POSIXct(strptime(s,fmt)))
Run Code Online (Sandbox Code Playgroud)
给出了这个文本输出:
[1] "2017-09-12 00:00:00.188 CEST"
[1] "2017-09-12 00:00:00.187 CEST"
Run Code Online (Sandbox Code Playgroud)
虽然我希望上面的结果是一样的.我错过了什么?
我的会话信息:
print(sessionInfo())
Run Code Online (Sandbox Code Playgroud)
得到:
R version 3.4.0 (2017-04-21)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1
Matrix products: default
locale:
[1] LC_COLLATE=Italian_Italy.1252 LC_CTYPE=Italian_Italy.1252 LC_MONETARY=Italian_Italy.1252 LC_NUMERIC=C
[5] LC_TIME=Italian_Italy.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.4.0 tools_3.4.0
Run Code Online (Sandbox Code Playgroud)
Linux中的结果相同:
R version 3.3.3 (2017-03-06)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] tools_3.3.3
Run Code Online (Sandbox Code Playgroud)
也许我错了,但在我看来0.002在浮点数上是不可表示的,仍然有0.002,POSIXct和POSIXlt之间没有区别:
options(digits.secs=3)
s<-"12:00:00.002"
fmt<-"%I:%M:%OS"
print(strptime(s,fmt))
print(as.POSIXct(strptime(s,fmt)))
Run Code Online (Sandbox Code Playgroud)
得到:
[1] "2017-09-12 00:00:00.002 CEST"
[1] "2017-09-12 00:00:00.002 CEST"
Run Code Online (Sandbox Code Playgroud)
您可以在日期时间文档中阅读有关此内容的信息:https ://stat.ethz.ch/R-manual/R-devel/library/base/html/DateTimeClasses.html
尤其:
类“POSIXct”表示自 1970 年初(UTC 时区)以来的(带符号)秒数,作为数值向量。
strptime另一个类POSIXlt以不同的方式存储日期时间。
因此亚秒级精度存在问题:
亚秒级精度
类“POSIXct”和“POSIXlt”能够表示秒的小数部分。(两种形式之间的分数转换可能不准确,但精度优于微秒。)
因此,您将准确地看到POSIXlt并strptime打印这些:
strptime(s,fmt)
as.POSIXlt(strptime(s,fmt), format = "%Y-%m-%d %H:%M:%OS")
Run Code Online (Sandbox Code Playgroud)
但是,由于POSIXct计算将日期表示为数字,因此由于浮点精度、闰秒等原因,它可能会不准确。
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |