2012-01-06 32 views
6

lubridate numaralı belgede belirtilen bir birimde belirtilen süreyi interval ile belirtilen süreyi elde etmenin en iyi yolu nedir? - ama belki buradaki biri birinin bildiğiYağış aralığı aralığı

> ival 
[1] 2011-01-01 03:00:46 -- 2011-10-21 18:33:44 

> difftime(attr(ival, "start") + as.numeric(ival), attr(ival, "start"), 'days') 
Time difference of 293.6479 days 

(Ben de iyi bir yol mevcut var varsayımı altında, https://github.com/hadley/lubridate/issues/105 bir özellik isteği olarak bu ekledi: Ben anlamaya tek şey aşağıdaki dağınık şey gibi bir şeydir.)

Güncelleme - görünüşte difftime fonksiyon ya bu işlemez. İşte bir örnek.

> (d1 <- as.POSIXct("2011-03-12 12:00:00", 'America/Chicago')) 
[1] "2011-03-12 12:00:00 CST" 
> (d2 <- d1 + days(1)) # Gives desired result 
[1] "2011-03-13 12:00:00 CDT" 
> (i2 <- d2 - d1) 
[1] 2011-03-12 12:00:00 -- 2011-03-13 12:00:00 
> difftime(attr(i2, "start") + as.numeric(i2), attr(i2, "start"), 'days') 
Time difference of 23 hours 

aşağıda söz olarak

, önce bir period onun girişini döküm olmayan bir /.interval işlevi uygulamak olacaktır bu işlemek için bir güzel bir yol olduğunu düşünüyorum.

+0

Belirli bir birimde aralık istediğinizi söylüyorsunuz, ancak aşağıdaki yorumların içeriğinden, en yakın birime yuvarlanmış olmasını istediğiniz gibi geliyor. Eğer öyleyse, daha fazla düzenleme yapabilirsin, öyle mi? –

+0

Hayır, yuvarlak olmasını istemiyorum. Belki yeni yaptığım düzenlemeler açıklığa kavuşuyor mu? –

cevap

10

as.duration işlevi, lubridate'in sağladığı işlevdir. Aralık sınıfı, başlangıçtan saniye sayısı olarak dahili olarak temsil edilir, bu nedenle saat sayısını istiyorsanız, as.numeric(ival)'u 3600'e veya (3600 * 24) günlerine bölebilirdiniz.

Nesnenize uygulanan işlev örneklerini görmek isterseniz, dput(ival çıkışını sağlamanız gerekir. Testimi, sayfasındaki yaratılan nesneler üzerinde yaptım, burada ?interval beni gönderdi.

date <- as.POSIXct("2009-03-08 01:59:59") # DST boundary 
date2 <- as.POSIXct("2000-02-29 12:00:00") 
span <- date2 - date #creates interval 
span 
#[1] 2000-02-29 12:00:00 -- 2009-03-08 01:59:59 
str(span) 
#Classes 'interval', 'numeric' atomic [1:1] 2.85e+08 
# ..- attr(*, "start")= POSIXct[1:1], format: "2000-02-29 12:00:00" 
as.duration(span) 
#[1] 284651999s (9.02y) 
as.numeric(span)/(3600*24) 
#[1] 3294.583 
# A check against the messy method: 
difftime(attr(span, "start") + as.numeric(span), attr(span, "start"), 'days') 
# Time difference of 3294.583 days 
+0

Teşekkürler, ama bu doğru değil - 3600 * 24 her zaman bir saniyedeki saniye sayısı değildir. Yapmaya çalıştığım şey, zaten DST gibi şeyleri idare eden sistemlere girmektir. –

+0

@KenWilliams Neden bunun yanlış olduğunu düşündüğünüzü anlamıyorum. “süre” aslında DST'ye, yani “difftime” gibi bir anlam ifade ediyor gibi görünüyor. Örneğinizi 'as.duration 'kullanarak dönüştürdüğümde,' difftime 'kullandığınız aynı cevabı elde ediyorum. – joran

+0

Ayrıca, süreleri gün olarak bölebilirsiniz (1) – hadley

3

Ken, Güne bölerek (1) size ne istediğinizi verecektir. Aralıkları dönemlere böldüğünüzde Lubridate, süreleri bir süreye zorlamaz. (Aradaki bütün periyotların tam sayısını bulmak için kullanılan algoritma, fark ettiğiniz şey olabilir, anıların anı sayısıyla bölünen aralığı kullanan bir tahminle başlar).

Sonuç, aralığa uyan tam dönemlerin sayısıdır. Uyarı mesajı kullanıcıya bir tahmin olduğunu bildirir, çünkü cevaptan düşürülmüş bir dönemin bazı kesirleri olacaktır. Bir periyot ile matematik yapmak mantıklı değil çünkü biz daha kısa bir dönemin katlarına dönüşmedikçe bir saat zamanını değiştiremeyiz - ancak dönüşüm yapmak için tutarlı bir yol olmayacak. Örneğin, bahsettiğiniz gün 23 saate eşit olacaktır, ancak diğer günler 24 saate eşit olacaktır. Doğru yolu düşünüyorsunuz - dönemler DST'nin neden olduğu değişikliklere, sıçrama yıllarına vb. Saygı gösterme çabasıdır, ancak bunu yalnızca bütün birimler olarak yaparlar.

Yukarıda bahsettiğiniz çıkarma işleminde hatayı yeniden oluşturamıyorum. Benim için çalışıyor gibi görünüyor.

three <- force_tz(ymd_hms("2011-03-12 12:00:00"), "") 
    # note: here in TX, "" *is* CST 
    (four <- three + days(1)) 
    > [1] "2011-03-13 12:00:00 CDT" 
    four - days(1) 
    > [1] "2011-03-12 12:00:00 CST" 
+0

Ancak bir aralık, * bir dönüşte olduğu için dönüşümü yapmanın bir yoludur. Bazı keyfi günün 24 saati olup olmadığını bilmezsiniz, ancak * bu belirli günün 24 saati olup olmadığını bilirsiniz. hesaplamalar mümkün olmalıdır. –

+0

@KenWilliams Ben senin dikkatini çekerim. Lubridate şu anda bu hesaplamayı yapmıyor, ama belki de olmalı. Benim düşüncem, kalanın aralıktaki ilk günün 1/2'si olabileceği, ancak aradaki son günün 12/23'ünün olabileceği düşüncesiydi. Belki de son gün önemli olan. – Garrett