2017-09-12 15 views
6

đoạn nàyTrong R, tại sao tôi nhận được sự khác biệt một phần nghìn giây giữa POSIXct và POSIXlt?

options(digits.secs=3) 
s<-"12:00:00.188" 
fmt<-"%I:%M:%OS" 
print(strptime(s,fmt)) 
print(as.POSIXct(strptime(s,fmt))) 

cho sản lượng văn bản này:

[1] "2017-09-12 00:00:00.188 CEST" 
[1] "2017-09-12 00:00:00.187 CEST" 

trong khi tôi mong đợi những kết quả trên là giống nhau. Tôi đang thiếu gì?

thông tin phiên của tôi:

print(sessionInfo()) 

cho:

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 

Cùng một kết quả trong 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 

Chỉnh sửa (sau khi Roland'scomment)

Có lẽ tôi sai, nhưng có vẻ như với tôi rằng 0,002 là không biểu diễn trong dấu chấm động, vẫn với 0,002 không có sự khác biệt giữa POSIXct và POSIXlt:

options(digits.secs=3) 
s<-"12:00:00.002" 
fmt<-"%I:%M:%OS" 
print(strptime(s,fmt)) 
print(as.POSIXct(strptime(s,fmt))) 

cung cấp cho:

[1] "2017-09-12 00:00:00.002 CEST" 
[1] "2017-09-12 00:00:00.002 CEST" 
+3

Độ chính xác của dấu chấm động? Nhìn vào unclass (as.POSIXct (...)). – Roland

+0

@Roland vui lòng xem chỉnh sửa của tôi. –

Trả lời

1

bạn có thể đọc về điều này trong các tài liệu cho datetime: https://stat.ethz.ch/R-manual/R-devel/library/base/html/DateTimeClasses.html

Đặc biệt:

Lớp "POSIXct" đại diện cho số giây (đã ký) kể từ đầu năm 1970 (theo múi giờ UTC) dưới dạng vectơ số.

strptime và lớp khác POSIXlt lưu trữ các số liệu khác nhau.

Vì vậy, có những vấn đề với độ chính xác phụ thứ hai:

Sub giây Độ chính xác

Lớp học "POSIXct" và "POSIXlt" có thể thể hiện các phần phân đoạn của một giây. (Chuyển đổi phân số giữa hai hình thức có thể không chính xác, nhưng sẽ có độ chính xác tốt hơn so với micro giây.)

Vì vậy, bạn sẽ thấy POSIXltstrptime in những chính xác:

strptime(s,fmt) 
as.POSIXlt(strptime(s,fmt), format = "%Y-%m-%d %H:%M:%OS") 

Nhưng, vì POSIXct tính toán để biểu thị ngày dưới dạng số, nó có thể có những điểm không chính xác do độ chính xác của dấu phẩy động, giây nhảy vọt, v.v.

Các vấn đề liên quan