आर में मेरे पास यह डेटा है। फ्रेम

24:43:30 23:16:02 14:05:44 11:44:30 ...

ध्यान दें कि कुछ समय खत्म 24:00:00 होता है! वास्तव में मेरा सारा समय 02:00:00 से 25:59:59 के बीच है।

मैं अपने डेटासेट data में सभी प्रविष्टियों को 2 घंटे के साथ घटाना चाहता हूं। इस तरह मुझे एक नियमित डेटा-सेट मिलता है। मैं यह कैसे कर सकता हूँ?

मैंने यह कोशिश की

strptime(data, format="%H:%M:%S") - 2*60*60

और यह 23:59:59 के नीचे सभी प्रविष्टियों के लिए काम करता है। उपरोक्त सभी प्रविष्टियों के लिए मुझे केवल NA मिलता है क्योंकि strptime कमांड NA से ऊपर की सभी प्रविष्टियों के लिए 23:59:59 उत्पन्न करता है।

r
1
user6678274 1 सितंबर 2016, 12:45

2 जवाब

सबसे बढ़िया उत्तर

lubridate पैकेज का उपयोग करने से काम आसान हो सकता है!

> library(lubridate)
> t <- '24:43:30'
> hms(t) - hms('2:0:0')
[1] "22H 43M 30S"

अद्यतन:

तारीख को वापस टेक्स्ट में बदलना!

> substr(strptime(hms(t) - hms('2:0:0'),format='%HH %MM %SS'),12,20)
[1] "22:43:30"

@RHertel का अपडेट जोड़ना:

format(strptime(hms(t) - hms('2:0:0'),format='%HH %MM %SS'),format='%H:%M:%S')

लुब्रिडेट ऑब्जेक्ट बनाने का बेहतर तरीका:

s <- hms('02:23:58) - hms('2:0:0')
paste(hour(s),minute(s),second(s),sep=":")
"0:23:58"
4
Community 23 मई 2017, 13:33

हालांकि @amrrs के जवाब से मुख्य समस्या का समाधान हो जाता है, फ़ॉर्मेटिंग एक समस्या बनी रह सकती है क्योंकि hms() एक समान आउटपुट। यह एक उदाहरण के साथ सबसे अच्छा दिखाया गया है:

library(lubridate)
hms("01:23:45")
#[1] "1H 23M 45S"
hms("00:23:45")
#[1] "23M 45S"
hms("00:00:45")
#[1] "45S"

hms() को दिए गए समय के आधार पर आउटपुट में घंटों और मिनटों की प्रविष्टि हो भी सकती है और नहीं भी। इसके अलावा अग्रणी शून्य घंटे, मिनट और सेकंड के एकल अंकों के मूल्यों में छोड़े गए हैं। यह एक स्वरूपण दुःस्वप्न में बहुत अधिक परिणाम दे सकता है यदि कोई उस डेटा को एक सामान्य रूप में रखने का प्रयास करता है।

इस कठिनाई को हल करने के लिए पहले लुब्रिडेट के as.duration() फ़ंक्शन के साथ समय को अवधि में परिवर्तित किया जा सकता है। फिर, सेकंड में अवधि को एक POSIXct ऑब्जेक्ट में बदला जा सकता है जिससे घंटे, मिनट और सेकंड आसानी से format() के साथ निकाले जा सकते हैं:

times <- c("24:43:30", "23:16:02", "14:05:44", "11:44:30", "02:00:12")
shifted_times <- hms(times) - hms("02:00:00")
format(.POSIXct(as.duration(shifted_times),tz="GMT"), "%H:%M:%S")
#[1] "22:43:30" "21:16:02" "12:05:44" "09:44:30" "00:00:12"

यदि shifted_times को strptime() में पास कर दिया गया होता तो अंतिम प्रविष्टि "02: 00:12" मुश्किलें पैदा करती।

3
Community 23 मई 2017, 14:55