2014-09-04 6 views
10

मुझे नहीं पता कि यह क्यों काम नहीं करता है। यहाँ मेरी कोड है:लुब्रिडेट, दिनांक समय को एक स्वरूपित समय स्ट्रिंग में परिवर्तित करें

> t <- hms("14:11:49") 
> t 
[1] "14H 11M 49S" 
t <- t + minutes(3) 
> format(t, format="%H:%M:%S") 
[1] "14H 14M 49S" 
# Expected output: "14:14:49" 

अद्यतन:

वर्तमान में मैं इस समाधान मिल गया, लेकिन मुझे आशा है कि वहाँ एक और अधिक सुरुचिपूर्ण एक:

t <- hms("14:11:49") # example period object 
sprintf("%s:%s:%s", hour(t), minute(t), second(t)) 
#"14:11:49" 

उत्तर

13

सुनिश्चित नहीं है कि आपको hms और फिर प्रारंभिक स्ट्रिंग प्रारूप में कनवर्ट करने की आवश्यकता क्यों है।

library(lubridate) 
myTime <- "14:11:49" 
hms(myTime) 
#"14H 11M 49S" 

POSIXct_myTime <- parse_date_time(myTime,"hms") 
format(POSIXct_myTime, format="%H:%M:%S") 
#"14:11:49" 

संपादित करें: हम उपयोग कर सकते हैं paste:

t <- hms("14:11:49") 
t 
#[1] "14H 11M 49S" 
t <- t + minutes(3) 
t 
#[1] "14H 14M 49S" 

paste(hour(t),minute(t),second(t),sep=":") 
#[1] "14:14:49" 

बेंचमार्क उत्पादन:

op <- microbenchmark(
    Use_paste=paste(hour(t),minute(t),second(t),sep=":"), 
    Use_sprintf=sprintf("%s:%s:%s", hour(t), minute(t), second(t)), 
    times=1000000L) 
op 

# Unit: microseconds 
# expr min  lq median  uq  max neval 
# Use_paste 28.072 31.695 32.601 33.506 44253.42 1e+06 
# Use_sprintf 29.582 33.807 34.412 35.619 44367.52 1e+0 
+1

यह एक बेहतर विचार की तरह प्रतीत होता है। – MrFlick

+0

मुझे लगता है कि (paranoically) स्ट्रिंग प्रारूप पाठ फ़ाइल में लिखते समय प्रत्येक प्रविष्टि के लिए कुछ बाइट्स को बचाता है। आपका समाधान हालांकि वह नहीं करता जो मैं प्राप्त करने की कोशिश कर रहा हूं। यह रेखा 'चिकन-अंडे' समस्या है: 'POSIXct_myTime <- parse_date_time (myTime, "hms") '। मेरे पास स्ट्रिंग प्रारूप में MyTime नहीं है। मैंने '% एच:% एम:% एस' प्रारूप में लाखों प्रविष्टियां पढ़ी हैं, उन्हें फ़िल्टर करें और इनपुट के समान प्रारूप को वापस लिखना चाहते हैं। – biocyberman

+0

"... स्ट्रिंग प्रारूप पाठ फ़ाइल में लिखते समय प्रत्येक प्रविष्टि के लिए कुछ बाइट्स सहेजता है ..." - सुनिश्चित नहीं है कि यह सच है ... इसके अलावा, "... मेरे पास स्ट्रिंग प्रारूप में MyTime नहीं है .. । "- आपकी पोस्ट में आप एचएमएस को एक स्ट्रिंग पास कर रहे हैं -' hms ("14:11:49") ' – zx8754

2

समस्या यह है कि class(t) है " अवधि "और format.Period() फ़ंक्शन में format= के लिए पैरामीटर नहीं है। t ऑब्जेक्ट मानक POSIXt शैली ऑब्जेक्ट नहीं है जिसका उपयोग आप format() के साथ उपयोग करने के लिए किया जा सकता है। केवल format.POSIXct() और format.POSIXlt() फ़ंक्शंस इस तरह व्यवहार करेंगे।

तो संभवतः Period कक्षा को POSIXct में बदलने के लिए एक सहायक कार्य को परिभाषित करना सबसे आसान काम होगा। हम ऐसा कर सकते हैं साथ:

as.POSIXct.Period <- function(x, start=today()) { 
    X<-as.interval(x, start); 
    [email protected][email protected] 
} 

यह ध्यान रखें कि POSIXct एक तिथि/समय मान ही नहीं, एक समय मूल्य है महत्वपूर्ण है। तो डिफ़ॉल्ट रूप से हम मानते हैं कि आज मध्यरात्रि में शुरू हुआ। लेकिन तब हम जिस तरह से आप

format(as.POSIXct(t), format="%H:%M:%S") 
# [1] "14:11:49" 

चाहता था में प्रारूप का उपयोग मैं मानता हूं कि मैं एक विशेषज्ञ lubridate उपयोगकर्ता तो शायद नहीं कर रहा हूँ मैं एक स्पष्ट समारोह की अनदेखी की है सकते हैं, लेकिन इसे में lubridate कक्षाएं स्वरूपण के लिए विकल्प लगता है " सुंदर "प्रारूप बहुत सीमित हैं।

+0

यह समाधान काम करता है, लेकिन आवश्यकता होती है हो सकता है कि parse_date_time समारोह तुम क्या जरूरत है समय को बदलने के लिए एक अतिरिक्त कदम e_time ऑब्जेक्ट। वैसे भी, 'format.POSIXct()' और 'format.POSIXlt()' फ़ंक्शंस का उल्लेख करने के लिए धन्यवाद। – biocyberman

+1

खैर, आपका मूल प्रश्न सिर्फ आपको नहीं पता था कि यह क्यों काम नहीं करता है, यह किसी भी चीज़ के लिए "समाधान" नहीं मांग रहा था। यदि वह आपका वास्तविक प्रश्न नहीं था, तो मैं भविष्य में आपके प्रश्नों को बेहतर तरीके से लिखने की कोशिश करूंगा। मैंने केवल रूपांतरण किया क्योंकि आप वास्तव में '% h:% M:% S" 'वाक्यविन्यास के साथ 'प्रारूप' फ़ंक्शन का उपयोग करना चाहते हैं। – MrFlick

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