2011-03-22 14 views
10

diff कमांड के बीच अंतर की इकाइयां सेट करें दिनांक दिनांक प्रारूप में दिनांकों के वेक्टर में तिथियों के बीच अंतर देता है। मैं लौटाई गई इकाइयों को नियंत्रित करना चाहता हूं, लेकिन ऐसा लगता है कि वे स्वचालित रूप से निर्धारित होते हैं, इसे नियंत्रित करने का कोई तरीका नहीं है। यहाँ एक उदाहरण है:डेटाटाइम ऑब्जेक्ट्स

> t = Sys.time() 
> diff(c(t, t + 1)) 
Time difference of 1 secs 

और फिर भी:

> diff(c(t, t+10000)) 
Time difference of 1.157407 days 

"समय डेल्टा" वस्तु एक इकाइयों विशेषता है, लेकिन यह सशर्त, का एक समूह में दिन, सेकंड आदि सब कुछ मजबूर करने के लिए लिखने के लिए मूर्खतापूर्ण लगता है

+1

तो, आपका प्रश्न क्या है? आप वास्तव में क्या करना चाहते हैं? दो तारीख वस्तुओं के बीच सेकंड में अंतर प्राप्त करें? क्षमा करें, लेकिन यह मुझे स्पष्ट नहीं है। – Andrie

+0

मैं इनपुट के बावजूद इसे निरंतर इकाइयों को वापस करना चाहता हूं, यानी, कोई फर्क नहीं पड़ता कि डेल्टा दो तिथियों के बीच क्या है, अलग-अलग इकाइयों में हमेशा डेल्टा लौटाता है, चाहे वह दिन, सेकंड, साल हो। –

उत्तर

12

मुझे यकीन है कि आप द्वारा क्या मतलब है "सशर्त, का एक समूह," बस मैन्युअल रूप से इकाइयों में परिवर्तन नहीं कर रहा हूँ।

> t = Sys.time() 
> a <- diff(c(t,t+1)) 
> b <- diff(c(t, t+10000)) 
> units(a) <- "mins" 
> units(b) <- "mins" 
> a 
Time difference of 0.01666667 mins 
> b 
Time difference of 166.6667 mins 

?difftime देखें। यदि आपको केवल दो बार (लंबे वेक्टर की बजाय) के बीच अंतर प्राप्त करने के लिए diff का उपयोग करने की आवश्यकता है, तो, जैसा कि डिर्क सुझाव देता है, units पैरामीटर के साथ difftime फ़ंक्शन का उपयोग करें।

+1

धन्यवाद - मुझे एहसास नहीं हुआ कि मैं इस तरह से इकाइयों को बदल सकता हूं --- मैंने सोचा कि मुझे ऐसा कुछ करना होगा जैसे (diff (t) $ units == "sec") ... –

9

POSIXct प्रकार (जिसे आपने Sys.time() पर कॉल करके बनाया है) हमेशा युग के बाद से fractional सेकंड का उपयोग करें।

difftime() फ़ंक्शंस केवल आपके पढ़ने की खुशी के लिए प्रारूपित करता है। आप वास्तव में प्रारूप निर्दिष्ट हैं, तो आप आप निर्दिष्ट मिलती है:

R> difftime(t+ 10000,t,unit="secs") 
Time difference of 10000 secs 
R> difftime(t+ 10000,t,unit="days") 
Time difference of 0.115741 days 
R> 
6

मुझे लगता है कि आपको difftime की आवश्यकता है जिसमें आप वांछित इकाइयां निर्दिष्ट कर सकते हैं। देखें:

> difftime(Sys.time(), Sys.time()+10000) 
Time difference of -2.777778 hours 

> difftime(Sys.time(), Sys.time()+10000, units="secs") 
Time difference of -10000 secs 
1

सुनिश्चित नहीं हैं कि आप कैसे सटीक होना करने के लिए परवाह है, लेकिन आप के बारे में lubridate पैकेज के साथ तिथि-समय बहुत विशिष्ट मिल सकता है। समय इकाइयों के बारे में एक भद्दा बात यह है कि उनकी लंबाई तब होती है जब वे छलांग के सेकंड, लीप दिन और अन्य सम्मेलनों के कारण होती हैं।

लुब्रिडेट लोड करने के बाद, दिनांक समय घटाना स्वचालित रूप से एक समय अंतराल वस्तु बनाता है।

library(lubridate) 
int <- Sys.time() - (Sys.time() + 10000) 

आप इसे एक अवधि में बदल सकते हैं, जो सटीक समय को मापता है। दुर्व्यवहार सेकंड में प्रदर्शित होते हैं क्योंकि सेकेंड एकमात्र इकाई होती है जिसमें लगातार लंबाई होती है। यदि आप एक विशिष्ट इकाई में अपना उत्तर चाहते हैं, तो बस उस अवधि ऑब्जेक्ट से विभाजित करें जिसमें उन इकाइयों में से एक की लंबाई हो।

as.duration(int) 
int/dseconds(1) 
int/ddays(1) 
int/dminutes(5) #to use "5 minutes" as a unit 

या आप केवल एक अवधि में int बदल सकते हैं। अवधि के विपरीत, अवधि में सटीक और लगातार लंबाई नहीं होती है। लेकिन वे विश्वासपूर्वक घड़ी के समय मानचित्र। आप तिथि-समय पर दोनों अवधि और अवधि को जोड़कर और घटाकर गणित कर सकते हैं।

as.period(int) 
Sys.time() + dseconds(5) + dhours(2) - ddays(1) 
Sys.time() + hours(2) + months(5) - weeks(1) #these are periods 
1

योन diff() फ़ंक्शन (जैसे के रूप में मैं एक ddply समारोह के भीतर में करते हैं) का उपयोग करने के, आप भी सांख्यिक प्रारूप में इनपुट डेटा बदल सकते हैं हमेशा इस तरह सेकंड में मतभेद प्राप्त करने के लिए की जरूरत है:

> t = Sys.time() 
> diff(as.numeric(c(t, t+1))) 
[1] 1 
> diff(as.numeric(c(t, t+10000))) 
[1] 10000 

उस बिंदु से आप अन्य इकाइयों में अंतर की गणना करने के लिए भिन्न सेकंड का उपयोग कर सकते हैं।

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