2015-02-03 17 views
5

Zaman damgası yönetimimle ilgili bir sorun yaşıyorum. Veri kümemde iki değişken var: Zaman ve Bağıl Zaman. Zaman HH: MM: SS.ss biçimindedir, göreceli süre ise 0'dan beri geçen saniye miktarını içeren sayısal değişkentir (ör. 0.76, 1.28, 1.78, 2.38 ...). kolaylıklar aşkına varsayımsal durum düşünün sağlar:

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

Ben zaman milisaniye eklemek için aşağıdakileri yapın:
"09:33:23.78" "09:35:25.28" "09:36:26.98":

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

Ben neden istiyoruz

Ancak bunun yerine aşağıdakileri elde ederim:
"09:33:23.77" "09:35:25.27" "09:36:26.98"

Tek bir militanı çoğu zaman kapalı. Ve neden bunu yaptığını anlamıyorum. strptime işlevinde, yani (RTime %% 1) + 0.01 öğesinde 0,01 ekleyebilirim. Ama yukarıdaki örnekte gördüğünüz gibi, çok zarif ve daha önemlisi, onu her zaman 0.01 kapalı değil - son durumda olduğu gibi bulmuyorum. Neler olup bittiğine dair ipuçlarını veya belki de kodları iyileştirmek için önerileriniz var mı?

alkış
[çözüldü]
DÜZENLEME
: ilgi için
. Sonunda sorunumu çözdüm:

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

Bu, yuvarlama yerine yuvarlama işlemini zorlar ve bu da milisaniye cinsinden fark yaratır.
@Josh O'Brien ve @nrussell'e teşekkür ederiz!Zaman damgasına milisaniye eklenmesi R

+2

ben [cevabı burada] (* neden gerçekleştirildiğini * hakkında en azından kısmı) bu olduğuna inanıyoruz (http://stackoverflow.com/q/8889554/980833) –

+2

Değil soruna bir çözüm, ancak Sorunun, strptime yardım dosyasında, aşağıdan yaklaşık% 70 ('% V' geçişinden sonra 2 paragraf): '% S'nin çıkışta kesirli bölümleri yok sayar (ve değil) olduğunu unutmayın. bunu strftime (strptime (Time, format = "% H:% M:% OS") + (RTime %% 1), format = "% H:% M:% OS3") yaparak görebiliyorsunuz. – nrussell

+0

Teşekkürler! Dürüst olmak gerekirse, sorumu gönderen yarım saat, bu bağlantıyı buldum (https://stat.ethz.ch/pipermail/r-devel/2012-May/064211.html). bir cevap bulmak, ama ben hiçbir yere gitmiyordum. Yani biraz utanç verici: P. Yorumlarınız için çok teşekkürler! w neden şimdi. – tstev

cevap

3

As explained here (ve yukarıdaki yorumlarda @ nrussel), makinenin kesirli saniyeler için biraz kesin olmayan kayan nokta temsilinin strftime() 'un kesilmesinden (yuvarlanma değil) kaynaklanır.

Belki biraz kludgy düzeltmesi olarak, yazdırma işleminden önce her zaman değerine .Machine$double.eps'dan büyük, ancak .01'dan daha küçük - çok küçük bir değer ekleyen küçük bir yazdırma işlevi yazabilirsiniz.

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

Çözüm için çok teşekkürler! Ayrıca sonunda bulduğum şey - insanlar örneğin 0,005 ekleyerek zorlayarak yuvarlamayı önerdiler. Yorumlarınızı takdir edin! – tstev

İlgili konular