2012-05-22 20 views
45

मैं मान लीजिए data.framefooनिकालने घंटे और POSIXct से सेकंड

  start.time duration 
1 2012-02-06 15:47:00  1 
2 2012-02-06 15:02:00  2 
3 2012-02-22 10:08:00  3 
4 2012-02-22 09:32:00  4 
5 2012-03-21 13:47:00  5 

और class(foo$start.time) रिटर्न

[1] "POSIXct" "POSIXt" 

मैं foo$duration वी के एक भूखंड बनाना चाहते हैं जो निम्नलिखित। foo$start.time। मेरे परिदृश्य में, मुझे केवल वर्ष के वास्तविक दिन की बजाय दिन के समय में दिलचस्पी है। दिन के समय को निकालने के बारे में कोई कैसे जाता है: वेक्टर के POSIXct वर्ग से सेकंड?

+1

लाइब्रेरी 'लुब्रिडेट' और 'चिड़ियाघर' आपके लिए सहायक हो सकते हैं। लेकिन आधार आर में, 'प्रारूप (foo $ start.time, प्रारूप ='% एच: एम ') '। – Justin

+0

धन्यवाद। 'प्रारूप (foo $ start.time, format = '% h: m') वाला एक मुद्दा यह है कि आउटपुट वर्ण प्रारूप में है। मैं आउटपुट को किसी प्रकार के अंकीय प्रारूप में होना चाहता हूं ताकि इसे साजिश के एक्स अक्ष के रूप में उपयोग किया जा सके। – andrewj

+1

कई तरीके हैं। फिर मैं आपको 'लुब्रिडेट' या [इस पोस्ट] पर इंगित करूंगा (http://stackoverflow.com/questions/7655514/how-do-i-plot-only-the-time-portion-of-a-timestamp- एक तिथि सहित) – Justin

उत्तर

39

यह एक अच्छा सवाल है, और आर में तारीखों से निपटने में कुछ कठिनाई को हाइलाइट करता है। लुब्रिडेट पैकेज बहुत आसान है, इसलिए नीचे मैं दो दृष्टिकोण प्रस्तुत करता हूं, आधार का उपयोग करते हुए (जैसा कि @ आरजे- द्वारा सुझाया गया है) और अन्य लुब्र्रिडेट का उपयोग कर। (यह करने के लिए दो तरीके)

foo <- data.frame(start.time = c("2012-02-06 15:47:00", 
           "2012-02-06 15:02:00", 
           "2012-02-22 10:08:00"), 
        duration = c(1,2,3)) 

POSIXct और POSIXt वर्ग में कनवर्ट

# using base::strptime 
t.str <- strptime(foo$start.time, "%Y-%m-%d %H:%M:%S") 

# using lubridate::ymd_hms 
library(lubridate) 
t.lub <- ymd_hms(foo$start.time) 

अब, निकालने समय:

(के पहले दो पंक्तियों) को पुन: बनाएं मूल पोस्ट में dataframe के रूप में दशमलव घंटे

# using base::format 
h.str <- as.numeric(format(t.str, "%H")) + 
       as.numeric(format(t.str, "%M"))/60 

# using lubridate::hour and lubridate::minute 
h.lub <- hour(t.lub) + minute(t.lub)/60 

दिखाएं कि इन तरीकों के बराबर हैं:

identical(h.str, h.lub) 

फिर foo$hr को दशमलव घंटे आवंटित करने के लिए ऊपर तरीकों में से एक का चयन:

library(ggplot2) 
qplot(foo$hr, foo$duration) +  
             scale_x_datetime(labels = "%S:00") 
+0

सुझाव के लिए धन्यवाद। हालांकि, जब उपरोक्त प्लॉट किया जाता है, तो यह प्रत्येक बार एक संख्या के रूप में लेबल या श्रेणी के रूप में इंगित करता है। दूसरे शब्दों में, अंक एक्स अक्ष पर समान दूरी पर हैं। निम्नलिखित 'फू' लेते हुए और फिर निम्नलिखित 'foo $ start.time.numeric <-hour (foo $ start.time) + मिनट (foo $ start.time)/60' के रूप में निम्नलिखित के साथ अंतर को तुलना करें। साथ (foo, qplot (start.time.numeric, अवधि)) ' – andrewj

+0

@andrewj मैंने इस –

+1

को संबोधित करने के लिए अपना उत्तर अपडेट किया है इस मुद्दे के संदर्भ में, आप यहां इस पोस्ट से http: // stackoverflow का वर्णन कर रहे हैं। कॉम/प्रश्न/7655514/कैसे-करें-i-plot-only-the-time-part-of-a-timestamp-सहित-तिथि, 'qplot (घंटा (foo $ start.time) + मिनट (foo $ start.time)/60, foo $ अवधि) + scale_x_datetime (लेबल = date_format ("% S: 00")) '। ऐसा लगता है कि 'scale_x_datetime' को' लेबल 'पैरामीटर बदलना है। – andrewj

14

आप आधार आर पर भरोसा कर सकता है:

foo$hr <- h.str 

# If you prefer, the choice can be made at random: 
foo$hr <- if(runif(1) > 0.5){ h.str } else { h.lub } 

तो ggplot2 पैकेज का उपयोग साजिश

# Using R 2.14.2 
# The same toy data 
foo <- data.frame(start.time = c("2012-02-06 15:47:00", 
           "2012-02-06 15:02:00", 
           "2012-02-22 10:08:00"), 
        duration = c(1,2,3)) 

Si एनसी कक्षा POSIXct में संरचित तरीके से दिनांक-समय की जानकारी होती है, आप POSIXct वेक्टर के भीतर समय स्थिति में वर्ण निकालने के लिए substr पर भरोसा कर सकते हैं।

# Extract hour and minute as a character vector, of the form "%H:%M" 
substr(foo$start.time, 12, 16) 

और फिर यह एक मनमाना तारीख करने के लिए पेस्ट इसे वापस POSIXct में बदलने के लिए: यह (यह कैसे जब मुद्रित प्रस्तुत किया जाएगा), तो आप घंटे और मिनट निकाल सकते हैं, है यह देखते हुए आप अपने POSIXct का स्वरूप पता है। उदाहरण में मैं जनवरी 2012 का उपयोग करता हूं, लेकिन यदि आप कोई तारीख निर्दिष्ट नहीं करते हैं और इसके बजाय format R का उपयोग वर्तमान दिनांक का उपयोग करता है।

# Store time information as POSIXct, using an arbitrary date 
foo$time <- as.POSIXct(paste("2012-01-01", substr(foo$start.time, 12, 16))) 

और दोनों plot और ggplot2 पता बॉक्स से बाहर POSIXct में बार प्रारूप बनाने के तरीके।

# Plot it using base graphics 
plot(duration~time, data=foo) 

# Plot it using ggplot2 (0.9.2.1) 
library(ggplot2) 
qplot(x=time, y=duration, data=foo) 
5

इस कोड को ज्यादा स्ट्रिंग में कनवर्ट करने की तुलना में तेजी और वापस संख्यात्मक

time <- c("1979-11-13T08:37:19-0500", "2014-05-13T08:37:19-0400"); 
time.posix <- as.POSIXct(time, format = "%Y-%m-%dT%H:%M:%S%z"); 
time.epoch <- as.vector(unclass(time.posix)); 
time.poslt <- as.POSIXlt(time.posix, tz = "America/New_York"); 
time.hour.new.york <- time.poslt$hour + time.poslt$min/60 + time.poslt$sec/3600; 

> time; 
[1] "1979-11-13T08:37:19-0500" "2014-05-13T08:37:19-0400" 
> time.posix; 
[1] "1979-11-13 15:37:19 IST" "2014-05-13 15:37:19 IDT" 
> time.poslt; 
[1] "1979-11-13 08:37:19 EST" "2014-05-13 08:37:19 EDT" 
> time.epoch; 
[1] 311348239 1399984639 
> time.hour.new.york; 
[1] 8.621944 8.621944 
2

Lubridate दिन डेटा के समय से हैंडल नहीं करता है, तो हेडली डेटा के इस प्रकार के लिए एचएमएस पैकेज की सिफारिश की। कुछ इस तरह काम करेगा:

library(lubridate) 
foo <- data.frame(start.time = parse_datetime(c("2012-02-06 15:47:00", 
           "2012-02-06 15:02:00", 
           "2012-02-22 10:08:00")), 
        duration = c(1,2,3)) 


foo<-foo %>% mutate(time_of_day=hms::hms(second(start.time),minute(start.time),hour(start.time))) 

बाहर 2 संभावित मुद्दों के लिए देखें - 1) lubridate एक अलग समारोह कहा जाता एचएमएस 2) एचएमएस :: एचएमएस है और (इसके नाम से सुझाव दिया है कि करने के लिए विपरीत क्रम में तर्क लेता है ताकि केवल सेकंड ही आपूर्ति की जा सकें)

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