2011-11-20 18 views
5

मैं आर फ़ंक्शन के लिए सभी सहायता खोज रहा हूं जो कि समय-समय पर परिवर्तित होगा, उदाहरण के लिए "15 मिनट" या "1 घंटा" या "6 सेकंड" या "1 दिन" डेटाटाइम ऑब्जेक्ट में "00:15:00" या "01:00:00" या "00:00:06" या "1 9 60- 01-02 00:00:00 "(इस के लिए निश्चित नहीं है)। मुझे यकीन है कि इस तरह का एक कार्य मौजूद है या प्रोग्रामिंग से बचने के लिए एक साफ तरीका है ...टाइमपैन से (उदाहरण के लिए "15 मिनट" या "2 सेकंड") "00:15:00" या "00:00:02"

अधिक विशिष्ट होने के लिए मैं ऐसा कुछ करना चाहूंगा (निर्मित फ़ंक्शन नाम transform.span.to.time):

library(chron) 

times(transform.span.to.time("15 min")) 

जो समान ही परिणाम चाहिए के रूप में

times("00:15:00") 

transform.span.to.time ("15 मिनट") की तरह एक समारोह जो की तरह "00:15:00 कुछ देता है "मौजूद है या क्या यह एक चाल है कि ऐसा कैसे करें?

उत्तर

3

आधार समारोह ?cut.POSIXt करता breaks के लिए मूल्यों के एक निश्चित समूह के लिए यह काम:

breaks: a vector of cut points _or_ number giving the number of 
     intervals which ‘x’ is to be cut into *_or_ an interval 
     specification, one of ‘"sec"’, ‘"min"’, ‘"hour"’, ‘"day"’, 
     ‘"DSTday"’, ‘"week"’, ‘"month"’, ‘"quarter"’ or ‘"year"’, 
     optionally preceded by an integer and a space, or followed by 
     ‘"s"’. For ‘"Date"’ objects only ‘"day"’, ‘"week"’, 
     ‘"month"’, ‘"quarter"’ and ‘"year"’ are allowed.* 

cut.POSIXt में टाइप करके स्रोत कोड देखें, प्रासंगिक अनुभाग इस के साथ शुरू होता:

else if (is.character(breaks) && length(breaks) == 1L) { 

आप अपनी जरूरतों के लिए काम करने के लिए इस खंड में कोड अपना सकते हैं।

6

हम संख्याओं और इकाइयों को अलग करने वाली एक जगह, और "सेक" इकाई के बाद कोई पिछली जगह नहीं मानेंगे। यह मिश्रित इकाइयों को संभालेगा:

test <- "0 hours 15 min 0 secs" 

transform.span <- function(test){ 
    testh <-   if(!grepl(" hour | hours ", "0 hours 15 min 0 secs")){ 
      # First consequent if no hours 
             sub("^", "0:", test)} else { 
             sub(" hour | hours ", ":", test)} 
    testm <- if(!grepl(" min | minutes ", testh)) {  
      # first consequent if no minutes 
             sub(" min | minutes ", "0:", testh)} else{ 
             sub(" min | minutes ", ":", testh) } 

    test.s <- if(!grepl(" sec| secs| seconds", testm)) { 
       # first consequent if no seconds 
             sub(" sec| secs| seconds", "0", testm)} else{ 
             sub(" sec| secs| seconds", "", testm)} 

    return(times(test.s)) } 
### Use 
> transform.span(test) 
[1] 00:15:00 
> test2 <- "21 hours 15 min 38 secs" 
> transform.span(test2) 
[1] 21:15:38 
2

@DWin: धन्यवाद।

transform.span<-function(timeSpan) { 
    timeSpanH <- if(!grepl(" hour | hours | hour| hours|hour |hours |hour|hours", timeSpan)) { 
       # First consequent if no hours 
       sub("^", "00:", timeSpan) 
      } else { 
       sub(" hour | hours | hour| hours|hour |hours |hour|hours", ":", timeSpan) 
      } 
    timeSpanM <- if(!grepl(" min | minutes | min| minutes|min |minutes |min|minutes", timeSpanH)) {  
       # first consequent if no minutes 
       paste("00:", timeSpanH, sep="") 
      } else{ 
       sub(" min | minutes | min| minutes|min |minutes |min|minutes", ":", timeSpanH) 
      } 
    timeSpanS <- if(!grepl(" sec| secs| seconds|sec|secs|seconds", timeSpanM)) { 
       # first consequent if no seconds 
       paste(timeSpanM, "00", sep="") 
      } else{ 
       sub(" sec| secs| seconds|sec|secs|seconds", "", timeSpanM) 
      } 

    return(timeSpanS) 
} 
### Use 
test <- "1 hour 2 min 1 sec" 
times(transform.span(test)) 
test1hour <- "1 hour" 
times(transform.span(test1hour)) 
test15min <- "15 min" 
times(transform.span(test15min)) 
test4sec <- "4 sec" 
times(transform.span(test4sec)) 
3

आप difftime के साथ समय अवधि निर्धारित कर सकते हैं:

span2time <- function(span, units = c('mins', 'secs', 'hours')) { 
    span.dt <- as.difftime(span, units = match.arg(units)) 
    format(as.POSIXct("1970-01-01") + span.dt, "%H:%M:%S") 
} 

उदाहरण के लिए:

> span2time(15) 
[1] "00:15:00" 

DWin उदाहरण पर मैं थोड़ा पुन: व्यवस्थित और यहाँ आधार पर परिणाम है

संपादित करें: क्रोन केको स्वीकार्य वर्ण स्ट्रिंग का उत्पादन करने के लिए संशोधित।

4

पहला समाधान gsubfn पैकेज में strapply का उपयोग करता है और दिन में बदल जाता है, उदा। 1 घंटा एक दिन का 1/24 वां है। दूसरा समाधान एक आर अभिव्यक्ति में बदल जाता है जो दिनों की संख्या की गणना करता है और फिर इसका मूल्यांकन करता है।

library(chron) 

transform.span.to.time2 <- function(x) { 
    x <- paste(x, 0) 
    x <- sub("h\\w*", "*3600+", x, ignore.case = TRUE) 
    x <- sub("m\\w*", "*60+", x, ignore.case = TRUE) 
    x <- sub("s\\w*", "+", x, ignore.case = TRUE) 
    unname(sapply(x, function(x) eval(parse(text = x)))/(24*3600)) 
} 

टेस्ट::

> x <- c("12 hours 3 min 1 sec", "22h", "18 MINUTES 23 SECONDS") 
> 
> times(transform.span.to.time(x)) 
[1] 12:03:01 22:00:00 00:18:23 
> 
> times(transform.span.to.time2(x)) 
[1] 12:03:01 22:00:00 00:18:23 

library(gsubfn) 
library(chron) 

unit2days <- function(d, u) 
    as.numeric(d) * switch(tolower(u), s = 1, m = 60, h = 3600)/(24 * 3600) 
transform.span.to.time <- function(x) 
    sapply(strapply(x, "(\\d+) *(\\w)", unit2days), sum) 

यहाँ एक दूसरा उपाय है

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