2013-06-14 7 views
10

मेरे पास घंटों का वेक्टर है। उदाहरण के लिए:एक समय कैसे गोल करें?

vec.hours <- c("15:52:00", "15:56:00", "12:10:00", "15:12:00", "11:49:00" ,"13:35:00", "14:53:00") 

मैं घंटे दौर के लिए नए घंटे कि निकटतम पूर्ण 5 मिनट, इस तरह होगा प्राप्त करना चाहते हैं।

round.hours <- c("15:50:00", "16:00:00", "12:10:00", "15:10:00", "11:50:00" ,"13:35:00", "14:55:00") 

मैं इस

hour <- strptime(vec.hours , "%H:%M:%S") 
round.hour <- round(hour , "mins") 

की कोशिश की लेकिन यह काम नहीं कर रहा।

के बाद प्रत्येक round.hours मैं एक घंटे करने के लिए +/- चाहते हैं, उदाहरण के लिए इस तरह के लिए:

hour.rd <- strptime(round.hours[1] , "%H:%M:%S") 
hourM <- hour.rd - 3600 
hourP <- hour.rd + 3600 
l.tm <- timeSequence(from = hourM, to = hourP,format = "%H-%S-%M",by="5 min",FinCenter = "Europe/Zurich") 
तो

, 15:50:00 के लिए मैं 14:50 से समय की एक वेक्टर है 16:50 तक।

मुझे नहीं पता कि vec.hours से round.our कैसे प्राप्त करें।

बहुत धन्यवाद

उत्तर

9

मैं datetime वस्तुओं में घंटे रखा, POSIXlt करने के लिए इन कन्वर्ट, जो आप पूर्णांक विभाजन का उपयोग कर दौर, पूर्णांक के रूप मिनट तक पहुँचने के लिए अनुमति देता है, तो घंटे फिर से निकालें।

timestamps <- as.POSIXlt(as.POSIXct('1900-1-1', tz='UTC') + as.difftime(vec.hours)) 
timestamps$min <- (timestamps$min + 5/2) %/% 5 * 5 
format(timestamps, format='%H:%M:%S') 
# [1] "15:50:00" "15:55:00" "12:10:00" "15:10:00" "11:50:00" "13:35:00" "14:55:00" 
2

xts पैकेज से आप उपयोग कर सकते हैं align.time

# align to next whole 5 min interval 
align.time(hour, 5*60) 
[1] "2013-06-14 15:55:00 CEST" "2013-06-14 16:00:00 CEST" "2013-06-14 12:15:00 CEST" "2013-06-14 15:15:00 CEST" 
[5] "2013-06-14 11:50:00 CEST" "2013-06-14 13:40:00 CEST" "2013-06-14 14:55:00 CEST" 

यह अगले अवधि के शुरू करने के timestamps बदल जाएगा, ओपी, निकटतम को शुरू करने के लिए है, जिनमें से थोड़ा अलग अवधि।

+0

लेकिन क्या यह केवल गोल नहीं है? – alexwhan

+0

@alexwhan हाँ। मैं एक स्पष्टीकरण जोड़ने के लिए अपना जवाब संपादित करता हूं। – agstudy

0

एक वैकल्पिक, जवाब here के आधार पर - 300 से विभाजित के बाद दौर (5 मिनट * 60 सेकंड), तो 300 से परिणाम गुणा करते हैं:

format(as.POSIXlt(as.POSIXct('2000-1-1', "UTC") + 
        round(as.numeric(hours)/300)*300), 
     format = "%H:%M:%S") 

#[1] "15:50:00" "15:55:00" "12:10:00" "15:10:00" "11:50:00" "13:35:00" "14:55:00" 
2

Lubridate पैकेज बहुत दोस्ताना round_date समारोह है।

round_date(hour,unit="5 minutes") 

[1] "2017-08-28 15:50:00 UTC" "2017-08-28 15:55:00 UTC" 
[3] "2017-08-28 12:10:00 UTC" "2017-08-28 15:10:00 UTC" 
[5] "2017-08-28 11:50:00 UTC" "2017-08-28 13:35:00 UTC" 
[7] "2017-08-28 14:55:00 UTC" 
संबंधित मुद्दे