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
5
A
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
- 1. unix zaman damgasını H2 zaman damgasına dönüştürün
- 2. Haskell Zaman tipi tutma milisaniye
- 3. Kakao'da Milisaniye Zaman Aralıklarını Belirleme
- 4. Php'de bir unix zaman damgasına 24 saat nasıl ekleyebilirim?
- 5. Python'da unix zaman damgasına saat ekleme
- 6. Ruby/Rails: Bir UNIX zaman damgasına dönüştürme
- 7. java.time.LocalDateTime SE 8 zaman damgasına dönüştürme
- 8. Zaman damgasına dinamik olarak aralık eklemek nasıl?
- 9. milisaniye
- 10. VBScript kullanarak milisaniye ile zaman bul
- 11. Bir tarihi, Twig ile bir UNIX zaman damgasına nasıl dönüştürebilirim?
- 12. mySQL Sütun veri türünü metinden zaman damgasına değiştirin
- 13. javascript'te bir dize bir Unix zaman damgasına nasıl dönüştürülür?
- 14. Herhangi bir tarih dizesini saat dilimi olmadan zaman damgasına dönüştürün
- 15. SQLite3'te bir datetime dizesini UNIX zaman damgasına nasıl dönüştürebilirim?
- 16. Bir sql string çıktısını C ile zaman damgasına dönüştür C#
- 17. Raylar: belirli bir zaman damgasına kadar tüm geçişleri çalıştırma
- 18. C# - Geçerli UNIX zaman damgasına X dakika nasıl eklenir
- 19. ISO 8601 biçimlendirilmiş tarihi jQuery ile zaman damgasına nasıl dönüştürülür?
- 20. Zaman damgalarıyla uğraşmak R
- 21. Java Milisaniye tarihi
- 22. Milisaniye nasıl ayrılır?
- 23. Raylar: her zaman için her model için milisaniye değerini ekleyin
- 24. ISO 8601 biçimli zaman dilimini keneler/milisaniye dönüştürün
- 25. Milisaniye kaç kez zaman damgası, 41 bit ile temsil edilebilir?
- 26. UNIX zaman damgası (milisaniye ile) HH için: MM: SS Python'da
- 27. yorum eklenmesi
- 28. birleştirme/birleştirme zaman dizileri (R)
- 29. SetInterval neden milisaniye cinsinden değil?
- 30. Milisaniye için kovandan çıkma süresi
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) –
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
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