2015-02-03 27 views
5

Tôi gặp sự cố với việc quản lý dấu thời gian của mình. Trong tập dữ liệu của tôi, tôi có hai biến, cụ thể là Thời gian và Thời gian tương đối. Thời gian ở định dạng HH: MM: SS.ss trong khi thời gian tương đối là biến số có chứa số giây đã trôi qua kể từ 0 (tức là 0,76, 1,28, 1,78, 2,38 ...). Đối Tính đơn giản vì lợi ích cho phép xem xét các tình huống giả thiết:

Time <- c("09:33:23.00", "09:35:25.00", "09:36:26.00")
RTime <- c(0.78, 1.28, 3.98)

Sau đó, tôi làm như sau để thêm phần nghìn giây để thời gian:

ATime <- strftime(strptime(Time,format="%H:%M:%OS")+(RTime %% 1),format="%H:%M:%OS2")

Tôi muốn nó dẫn đến:
"09:33:23.78" "09:35:25.28" "09:36:26.98"

Nhưng thay vào đó tôi nhận được các thông tin sau:
"09:33:23.77" "09:35:25.27" "09:36:26.98"

Chỉ một millise của nó ngưng hầu hết thời gian. Và tôi không hiểu tại sao nó làm điều đó. Tôi có thể thêm 0,01 vào hàm strptime, tức là (RTime %% 1) + 0.01. Nhưng tôi không thấy rằng rất thanh lịch và quan trọng hơn, như bạn có thể thấy trong ví dụ trên, nó không phải luôn luôn 0,01 off - như với trường hợp cuối cùng. Bất kỳ gợi ý nào về những gì đang xảy ra, hoặc có lẽ là gợi ý để cải thiện mã?

Cheers

[SOLVED]
EDIT: Đối với những người quan tâm. Đây là cách tôi cuối cùng đã giải quyết được vấn đề của mình:

ATime <- strftime(strptime(Time,format="%H:%M:%OS")+(RTime %% 1)+0.005,format="%H:%M:%OS2")

'lực' này làm tròn thay vì cắt ngắn dẫn đến sự khác biệt tính bằng mili giây.
Nhờ @Josh O'Brien và @nrussell cho ý kiến ​​của họ!Thêm mili giây vào Dấu thời gian trong R

+2

Tôi tin này (ít nhất là phần về * tại sao * đó đang xảy ra) được [trả lời ở đây] (http://stackoverflow.com/q/8889554/980833) –

+2

Không phải là một giải pháp cho vấn đề của bạn, nhưng Tôi nghĩ rằng vấn đề được giải thích trong 'strptime' helpfile, khoảng 70% xuống từ đầu (2 đoạn sau đoạn'% V': 'Lưu ý rằng% S bỏ qua (và không làm tròn) các phần phân đoạn trên đầu ra.'. có thể thấy điều này bằng cách thực hiện 'strftime (strptime (Time, format ="% H:% M:% OS ") + (RTime %% 1), format ="% H:% M:% OS3 ")' – nrussell

+0

Cảm ơn! Thành thật mà nói, nửa giờ gửi câu hỏi của tôi, tôi thấy [link] này (https://stat.ethz.ch/pipermail/r-devel/2012-May/064211.html). Trước khi đăng bài, tôi đã cố gắng rất nhiều để tìm một câu trả lời, nhưng tôi đã không nhận được bất cứ nơi nào.Vì vậy, một chút lúng túng: P.Cảm ơn rất nhiều cho các ý kiến! Ít nhất là tôi kno tại sao bây giờ. – tstev

Trả lời

3

As explained here (và bởi @nrussel trong các nhận xét ở trên) điều này là do cắt ngắn strftime() (không làm tròn!) Của biểu diễn dấu phẩy động không chính xác một chút của các phân số giây.

Như một sửa chữa có lẽ hơi kludgy, bạn có thể viết một hàm nhỏ in có thêm một giá trị rất nhỏ - lớn hơn .Machine$double.eps nhưng ít hơn .01 - cho mỗi giá trị thời gian trước khi in nó.

strftime2 <- function(x, ...) { 
    strftime(x + 1e-6, ...) 
} 

## Compare results 
strftime(strptime(Time,format="%H:%M:%OS")+(RTime %% 1),format="%H:%M:%OS2") 
# [1] "09:33:23.77" "09:35:25.27" "09:36:26.98" 
strftime2(strptime(Time,format="%H:%M:%OS")+(RTime %% 1),format="%H:%M:%OS2") 
# [1] "09:33:23.78" "09:35:25.28" "09:36:26.98" 
+0

Cảm ơn rất nhiều vì giải pháp! Nó cũng là những gì tôi cuối cùng đã tìm thấy - mọi người đề nghị lực làm tròn bằng cách thêm 0,005 ví dụ. Đánh giá cao nhận xét! – tstev

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