2012-01-06 15 views
6

interval द्वारा lubridate में निर्दिष्ट इकाइयों में, समय की लंबाई प्राप्त करने का सबसे अच्छा तरीका क्या है? - लेकिन शायद किसी को यहाँ एक का पतालुब्रिडेट अंतराल की लंबाई

> 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 

(मैं भी इस एक सुविधा का अनुरोध के रूप में https://github.com/hadley/lubridate/issues/105 पर धारणा वहाँ कोई बेहतर तरीका उपलब्ध है कि के तहत जोड़ा,: सभी मैं पता लगा सकते हैं निम्नलिखित गंदा बात की तरह कुछ है।)

अद्यतन - स्पष्ट रूप से difftime फ़ंक्शन इसे संभाल नहीं करता है। यहां एक उदाहरण दिया गया है।

> (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 

मैं नीचे उल्लेख के रूप में, मैं इस संभालने के लिए एक /.interval समारोह है कि यह नहीं है कि पहले एक period को अपने इनपुट डाली लागू करने के लिए किया जाएगा एक अच्छा तरीका लगता है।

+0

आप कहते हैं कि आप किसी विशेष इकाई में अंतराल चाहते हैं लेकिन नीचे दी गई टिप्पणियों के संदर्भ से, ऐसा लगता है कि आप इसे निकटतम पूर्ण इकाई में गोल करना चाहते हैं। यदि ऐसा है तो आप आगे संपादित कर सकते हैं तो यह स्पष्ट है? –

+0

नहीं, मैं इसे गोल नहीं करना चाहता। हो सकता है कि मैंने जो संपादन अभी किए हैं, उन्हें स्पष्ट करने में मदद मिलेगी? –

उत्तर

10

as.duration फ़ंक्शन ल्यूब्रिडेट प्रदान करता है। अंतराल वर्ग को आंतरिक रूप से प्रारंभ से सेकंड की संख्या के रूप में दर्शाया जाता है, इसलिए यदि आप चाहते थे कि घंटों की संख्या आप as.numeric(ival) को 3600 तक, या दिन के लिए (3600 * 24) विभाजित कर सकें।

यदि आप अपनी वस्तु पर लागू कार्यों के उदाहरणों को काम करना चाहते हैं, तो आपको dput(ival का आउटपुट प्रदान करना चाहिए)। मैंने help(duration) पृष्ठ पर बनाए गए ऑब्जेक्ट्स पर अपना परीक्षण किया, जहां ?interval ने मुझे भेजा था।

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

धन्यवाद, लेकिन यह सही नहीं है - 3600 * 24 हमेशा एक दिन में सेकंड की संख्या नहीं है। जो मैं करने की कोशिश कर रहा हूं वह उन प्रणालियों में टैप करें जो पहले से ही डीएसटी जैसी चीजों को संभालते हैं। –

+0

@ केनविल्लियम्स मुझे समझ में नहीं आता कि आपको यह क्यों गलत लगता है। 'अवधि' का अर्थ यह है कि यह वास्तव में 'भिन्नता' की तरह डीएसटी का सम्मान करता है। जब मैं 'as.duration' का उपयोग करके अपना उदाहरण बदलता हूं तो मुझे' difftime' का उपयोग करके सटीक वही उत्तर मिलता है। – joran

+0

आप दिन (1) – hadley

3

केन, दिन (1) द्वारा विभाजित आपको जो चाहिए वह आपको देगा। जब आप अंतराल के अंतराल को विभाजित करते हैं तो लुब्रिडेट अवधि को अवधि तक सीमित नहीं करता है। (हालांकि अंतराल में पूरी अवधि की सटीक संख्या को खोजने के लिए एल्गोरिदम एक अनुमान के साथ शुरू होता है जो समानांतर संख्याओं से विभाजित अंतराल का उपयोग करता है, जो आप देख रहे हैं)।

अंतिम परिणाम अंतराल में फिट होने वाली पूरी अवधि की संख्या है। चेतावनी संदेश उपयोगकर्ता को अलर्ट करता है कि यह अनुमान है क्योंकि उत्तर से गिराए गए अवधि के कुछ अंश होंगे। गणित को एक अवधि के अंश के साथ समझना समझदार नहीं है क्योंकि हम इसके साथ घड़ी का समय संशोधित नहीं कर सकते हैं जब तक कि हम इसे कम अवधि के गुणकों में परिवर्तित न करें - लेकिन रूपांतरण करने के लिए एक सतत तरीका नहीं होगा। उदाहरण के लिए, जिस दिन आप उल्लेख करते हैं वह 23 घंटे के बराबर होगा, लेकिन अन्य दिन 24 घंटे के बराबर होंगे। आप सही तरीके से सोच रहे हैं - अवधि डीएसटी, लीप साल आदि के कारण भिन्नताओं का सम्मान करने का प्रयास है, लेकिन वे केवल इसे पूरी इकाइयों के रूप में करते हैं।

मैं ऊपर वर्णित घटाव में त्रुटि को पुन: उत्पन्न नहीं कर सकता। ऐसा लगता है यह मेरे लिए काम का होगा।

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

हालांकि - के लिए एक अंतराल, रूपांतरण * बनाने का एक तरीका है, क्योंकि यह एक सटीक पल में जड़ है। आपको नहीं पता कि कुछ मनमानी दिन में 24 घंटे हैं, लेकिन आप जानते हैं कि * इस विशिष्ट * दिन में 24 घंटे हैं, इसलिए गणना संभव होना चाहिए। –

+0

@ केनविल्लियम्स मैं आपका अंक लेता हूं। वर्तमान में लुब्रिडेट उस गणना को नहीं करता है, लेकिन शायद इसे चाहिए। मेरा विचार यह रहा है कि शेष अंतराल में पहले दिन का 1/2 हो सकता है, लेकिन अंतराल में अंतिम दिन का 12/23 हो सकता है। शायद आखिरी दिन सब कुछ मायने रखता है। – Garrett

संबंधित मुद्दे