2010-12-08 10 views
18

मैं अपने डेटाफ्रेम में दो कॉलम को 'अच्छी' तिथि & समय वर्ग में बदलने का प्रयास कर रहा हूं, और अब तक बहुत सफलता नहीं मिली है इसके साथ। मैंने विभिन्न वर्गों (टाइमडेट, दिनांक, टाइमरीज़, पॉज़िक्स, पॉज़िक्सल्ट) की कोशिश की है लेकिन सफलता के बिना। शायद मैं सिर्फ स्पष्ट दिख रहा हूं और क्योंकि मैंने इतने सारे दृष्टिकोणों की कोशिश की है, मुझे नहीं पता कि अब और क्या है। मुझे उम्मीद है कि आप में से कुछ कुछ गलत कहां छोड़ सकते हैं जहां मैं गलत हूं।उच्चतम (नवीनतम) और निम्नतम (सबसे पुराना) दिनांक [आर]

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

दूसरा लक्ष्य: मैं दैनिक प्रारूप से दिनांकों को परिवर्तित करना चाहता हूं (यानी 8-12 -2010) साप्ताहिक, मासिक, और वार्षिक स्तर (यानी '49 -2010 ',' दिसंबर -10 ', और बस' 2010 ') तक। यह प्रारूप सेटिंग्स (जैसे "% d-% m-% y") के साथ किया जा सकता है। क्या यह डेटा.फ्रेम को एक समय वर्ग में बदलने और सही प्रारूप में टाइमक्लास को बदलने के साथ किया जा सकता है (8-12-2010 -> प्रारूप ("% बी-% वाई") -> 'दिसंबर -10') , और फिर उस समय वर्ग को प्रत्येक माह के स्तर के साथ एक कारक में बदलना?

दोनों लक्ष्यों के लिए मुझे किसी भी समय डेटफ्रेम को किसी समय में परिवर्तित करने की आवश्यकता है, और यह वह जगह है जहां मैं कुछ कठिनाइयों में भाग गया।

मेरे dataframe इस तरह दिखता है:

> tradesList[c(1,10,11,20),14:15] -> tmpTimes4 
> tmpTimes4 
    EntryTime ExitTime 
1 01-03-07 10-04-07 
10 29-10-07 02-11-07 
11 13-04-07 14-05-07 
20 18-12-07 20-02-08 

यहाँ मैं क्या कोशिश की है की एक सारांश है:

> class(tmpTimes4) 
[1] "data.frame" 
> as.Date(head(tmpTimes4$EntryTimes, n=1), format="%d-%m-%y") 
Error in as.Date.default(head(tmpTimes4$EntryTimes, n = 1), format = "%d-%m-%y") : 
    do not know how to convert 'head(tmpTimes4$EntryTimes, n = 1)' to class "Date" 
> as.timeDate(tmpTimes4, format="%d-%m-%y") 
Error in as.timeDate(tmpTimes4, format = "%d-%m-%y") : 
    unused argument(s) (format = "%d-%m-%y") 
> timeSeries(tmpTimes4, format="%d-%m-%y") 
Error in midnightStandard2(charvec, format) : 
    'charvec' has non-NA entries of different number of characters 
> tmpEntryTimes4 <- timeSeries(tmpTimes4$EntryTime, format="%d-%m-%y") 
> tmpExitTimes4 <- timeSeries(tmpTimes4$ExitTime, format="%d-%m-%y") 
> tmpTimes5 <- cbind(tmpEntryTimes4,tmpExitTimes4) 
> colnames(tmpTimes5) <- c("Entry","Exit") 
> tmpTimes5 
    Entry Exit  
[1,] 01-03-07 10-04-07 
[2,] 29-10-07 02-11-07 
[3,] 13-04-07 14-05-07 
[4,] 18-12-07 20-02-08 
> class(tmpTimes5) 
[1] "timeSeries" 
attr(,"package") 
[1] "timeSeries" 
> as.timeDate(tmpTimes5, format="%d-%m-%y") 
Error in as.timeDate(tmpTimes5, format = "%d-%m-%y") : 
    unused argument(s) (format = "%d-%m-%y") 
> as.Date(tmpTimes5, format="%d-%m-%y") 
Error in as.Date.default(tmpTimes5, format = "%d-%m-%y") : 
    do not know how to convert 'tmpTimes5' to class "Date" 
> format.POSIXlt(tmpTimes5, format="%d-%m-%y", usetz=FALSE) 
Error in format.POSIXlt(tmpTimes5, format = "%d-%m-%y", usetz = FALSE) : 
    wrong class 
> as.POSIXlt(tmpTimes5, format="%d-%m-%y", usetz=FALSE) 
Error in as.POSIXlt.default(tmpTimes5, format = "%d-%m-%y", usetz = FALSE) : 
    do not know how to convert 'tmpTimes5' to class "POSIXlt" 
> as.POSIXct(tmpTimes5, format="%d-%m-%y", usetz=FALSE) 
Error in as.POSIXlt.default(x, tz, ...) : 
    do not know how to convert 'x' to class "POSIXlt" 

TimeDate संकुल 'सीमा' के लिए एक समारोह है, तथापि, को बदलने तिथि वर्ग एक व्यक्तिगत उदाहरण के लिए काम करता है, लेकिन किसी कारण से डेटा फ्रेम के लिए नहीं:

> as.Date(tmpTimes4[1,1], format="%d-%m-%y") 
[1] "2007-03-01" 
> as.Date(tmpTimes4, format="%d-%m-%y") 
Error in as.Date.default(tmpTimes4, format = "%d-%m-%y") : 
    do not know how to convert 'tmpTimes4' to class "Date" 

इस बिंदु पर मुझे विश्वास है कि ऐसा करना असंभव है, इसलिए किसी भी विचार की अत्यधिक सराहना की जाएगी!

सादर, कुछ डमी डेटा के साथ

+0

आप इस्तेमाल कर सकते हैं 'dput (tmpTimes4)' अपने कोड में सटीक डाटासेट उपयोग प्रदान करने के लिए। – Marek

+0

@Marek: जवाब देने के लिए धन्यवाद! मुझे डंप के बारे में पता नहीं था, इसलिए टिप के लिए धन्यवाद। :) – Jura25

उत्तर

30

प्रारंभ: लक्ष्य 1, गणना अंतर को देखो,

> head(tmpTimes) 
    EntryTime ExitTime 
8 2010-01-14 2010-03-16 
9 2010-01-05 2010-01-17 
7 2010-01-10 2010-01-30 
3 2010-01-08 2010-04-16 
10 2010-01-01 2010-01-26 
13 2010-01-12 2010-02-15 

ऊपर का उपयोग करना:

start <- as.Date("2010/01/01") 
end <- as.Date("2010/12/31") 
set.seed(1) 
datewant <- seq(start, end, by = "days")[sample(15)] 
tmpTimes <- data.frame(EntryTime = datewant, 
         ExitTime = datewant + sample(100, 15)) 
## reorder on EntryTime so in random order 
tmpTimes <- tmpTimes[sample(NROW(tmpTimes)), ] 
head(tmpTimes) 

तो हम कुछ इस तरह है सबसे पुरानी और नवीनतम तारीख के बीच। आप तिथियों का इलाज कर सकते हैं जैसे कि वे संख्याएं थीं (इस तरह वे आंतरिक रूप से किसी भी तरह से संग्रहीत होते हैं), इसलिए min() और max() जैसे कार्य काम करेंगे। आप difftime() फ़ंक्शन का उपयोग कर सकते हैं:

> with(tmpTimes, difftime(max(EntryTime), main(EntryTime))) 
Time difference of 14 days 

या मानक घटाव

> with(tmpTimes, max(EntryTime) - min(EntryTime)) 
Time difference of 14 days 

का उपयोग दिनों में अंतर मिलता है। head() और tail() केवल तभी काम करेंगे जब आप तिथियों को क्रमबद्ध करते हैं क्योंकि ये वेक्टर में पहला और अंतिम मान लेते हैं, न कि उच्चतम और निम्नतम वास्तविक मूल्य।

लक्ष्य 2: आप एक डेटा फ्रेम को एक तिथि में बदलने की कोशिश कर रहे हैं। आप यह नहीं कर सकते आप डेटा फ्रेम के घटकों में डेटा को दोबारा सुधार सकते हैं। यहां मैं tmpTimes पर EntryTime कॉलम को तिथि के कई अलग-अलग सारांशों में सुधार करके कॉलम जोड़ता हूं।

tmpTimes2 <- within(tmpTimes, weekOfYear <- format(EntryTime, format = "%W-%Y")) 
tmpTimes2 <- within(tmpTimes2, monthYear <- format(EntryTime, format = "%B-%Y")) 
tmpTimes2 <- within(tmpTimes2, Year <- format(EntryTime, format = "%Y")) 

देते:

> head(tmpTimes2) 
    EntryTime ExitTime weekOfYear monthYear Year 
8 2010-01-14 2010-03-16 02-2010 January-2010 2010 
9 2010-01-05 2010-01-17 01-2010 January-2010 2010 
7 2010-01-10 2010-01-30 01-2010 January-2010 2010 
3 2010-01-08 2010-04-16 01-2010 January-2010 2010 
10 2010-01-01 2010-01-26 00-2010 January-2010 2010 
13 2010-01-12 2010-02-15 02-2010 January-2010 2010 

आप अमेरिकी हैं या सप्ताह की शुरुआत (के लिए अमेरिका सम्मेलन उपयोग करना चाहते हैं %W, एक सोमवार को सप्ताह शुरू होता है अमेरिका सम्मेलन में एक पर शुरू करने के लिए है रविवार), %W से %U बदलें। ?strftime में %W और %U का प्रतिनिधित्व करने के बारे में अधिक जानकारी है।


डेटा स्वरूप पर एक अंतिम बिंदु: ऊपर में मैं मानक आर प्रारूप में तारीखों के साथ काम किया है। आपके डेटा को गैर-मानक मार्कअप में डेटा फ्रेम में संग्रहीत किया गया है, संभवतः वर्ण या कारक के रूप में। तो आपके पास कुछ ऐसा है:

tmpTimes3 <- within(tmpTimes, 
        EntryTime <- format(EntryTime, format = "%d-%m-%y")) 
tmpTimes3 <- within(tmpTimes3, 
        ExitTime <- format(ExitTime, format = "%d-%m-%y")) 

> head(tmpTimes3) 
    EntryTime ExitTime 
8 14-01-10 16-03-10 
9 05-01-10 17-01-10 
7 10-01-10 30-01-10 
3 08-01-10 16-04-10 
10 01-01-10 26-01-10 
13 12-01-10 15-02-10 

आपको उन पात्रों या कारकों को किसी चीज़ के रूप में परिवर्तित करने की आवश्यकता है जो आर को तारीख के रूप में समझता है। मेरी वरीयता "Date" कक्षा होगी। इससे पहले कि आप अपने डेटा के साथ ऊपर जवाब की कोशिश, सही प्रारूप के लिए अपने डेटा को परिवर्तित:

> head(tmpTimes3) 
    EntryTime ExitTime 
8 2010-01-14 2010-03-16 
9 2010-01-05 2010-01-17 
7 2010-01-10 2010-01-30 
3 2010-01-08 2010-04-16 
10 2010-01-01 2010-01-26 
13 2010-01-12 2010-02-15 
> str(tmpTimes3) 
'data.frame': 15 obs. of 2 variables: 
$ EntryTime:Class 'Date' num [1:15] 14623 14614 14619 14617 14610 ... 
$ ExitTime :Class 'Date' num [1:15] 14684 14626 14639 14715 14635 ... 
+0

वाह गेविन, बहुत बहुत धन्यवाद! आपने वास्तव में कोड उदाहरण के साथ ही उत्कृष्ट (और स्पष्ट) पाठ के साथ ही मेरी मदद की। फिर से धन्यवाद, मैं इसे पूरी तरह से प्राप्त करता हूं, और बस दिनों की संख्या की गणना करने, तिथियों को बदलने और प्रति अवधि अवधि के लिए resuls प्रदर्शित करने में सफल रहा। हाँ! :) – Jura25

+0

@ जुरा25: खुशी है कि आपको यह उपयोगी लगता है। –

+1

वास्तव में, तिथि के लिए न्यूनतम और अधिकतम कार्य, लेकिन यदि आपके दिनांक कॉलम में कोई एनए है, तो कृपया na.rm = TRUE का उपयोग करें। तारादिनांक <सफाई MIN (DateofTest, na.rm = TRUE)। अपने आप को सिर पर गूढ़ खरोंच बचाओ। –

5

लघु जवाब:

  • Convert

    tmpTimes3 <- 
        within(tmpTimes3, { 
          EntryTime <- as.Date(as.character(EntryTime), format = "%d-%m-%y") 
          ExitTime <- as.Date(as.character(ExitTime), format = "%d-%m-%y") 
          }) 
    

    ताकि आपके डेटा इस तरह दिखता है आज तक नहीं किया गया है।

  • फिर दिनांकों की सूची में न्यूनतम और अधिकतम का उपयोग करें।

    date_list = structure(c(15401, 15405, 15405), class = "Date") 
    date_list 
    #[1] "2012-03-02" "2012-03-06" "2012-03-06" 
    
    min(date_list) 
    #[1] "2012-03-02" 
    max(date_list) 
    #[1] "2012-03-06" 
    
संबंधित मुद्दे