2012-12-27 14 views
12

मैं data.table और विशेष रूप से AWESOME fread फ़ंक्शन का नया संस्करण उपयोग कर रहा हूं। मेरी फाइलों में ऐसी तिथियां होती हैं जो तारों के रूप में लोड की जाती हैं (कारण मुझे अन्यथा ऐसा नहीं पता) 01APR2008:09:00:00 की तरह दिख रहा है।सीधे कास्ट स्ट्रिंग IDateTime

मुझे उन डेटाटाइम पर डेटा.table को सॉर्ट करने की आवश्यकता है और फिर IDateTime प्रारूप (या फिर कुछ भी मुझे अभी तक नहीं पता) में डालने के लिए कुशल होने के लिए सॉर्ट करने की आवश्यकता है।

> strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S") 
[1] "2008-04-01 09:00:00" 

> IDateTime(strptime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S")) 
     idate itime 
1: 2008-04-01 09:00:00 

> IDateTime("01APR2008:09:00:00","%d%b%Y:%H:%M:%S") 
Error in charToDate(x) : 
character string is not in a standard unambiguous format 

ऐसा लगता है कि मैं DT[ , newType := IDateTime(strptime(oldType, "%d%b%Y:%H:%M:%S"))] नहीं कर सकता।

मेरे सवालों का तो कर रहे हैं:

  1. वहाँ fread से IDateTime के लिए सीधे कास्ट करने के लिए एक तरह से इस तरह के है, कि मैं इन सबसे बाद में कुशलता से कर सकते हैं?
  2. यदि नहीं, जानते हुए भी कि मैं
+0

क्या आप दिखा सकते हैं कि वे आपकी डेटा फ़ाइलों को कैसे देखते हैं? – agstudy

+0

हैलो, फ़ाइल 'सीपी = "के साथ एक सीएसवी फ़ाइल है;" 'और दिनांक प्रारूप' 01APR2008: 09: 00: 00 "जैसा दिखता है' 'प्रारूप ="% d% b% वाई:% एच: % एम:% S "'। मैंने जो किया वह 'डीटी [, दिनांक: = आईडीएट (पुराना टाइप,"% डी% बी% वाई ")]; डीटी [, समय: = आईटीम (पुराना टाइप,"% डी% बी% वाई:% एच:% एम :% एस ")] 'और अंत में' setkeyv (डीटी, सी (" तिथि "," समय "))' – statquant

+0

तारीख आपके डेटा का पहला स्तंभ है? – agstudy

उत्तर

11

दुर्भाग्य से इस datetime कॉलम के आधार पर डीटी सॉर्ट करने के लिए सक्षम होने के लिए चाहते हैं जाने के लिए सबसे कारगर तरीका है क्या (कार्यकुशलता के लिए) strptime एक POSIXlt प्रकार है, जो द्वारा असमर्थित है पैदा करता है data.table और हमेशा इसके आकार (40 बाइट प्रति तिथि!) और संरचना के कारण होगा। हालांकि strftime बहुत बेहतर POSIXct उत्पन्न करता है, फिर भी यह इसे POSIXlt के माध्यम से करता है। यहाँ और जानकारी:

http://stackoverflow.com/a/12788992/403310 

आधार इस तरह के कार्यों as.Date के रूप में देख रहे हैं, यह strptime भी उपयोग करता है, एक पूर्णांक युग से ऑफसेट बनाने (विचित्र रूप से) डबल के रूप में जमा। IDate (और दोस्तों) कक्षा data.table में कक्षा, पूर्णांक, पूर्णांक के रूप में संग्रहीत पूर्णांक युग ऑफसेट प्राप्त करने का लक्ष्य रखती है। base::sort.list(method = "radix") (जो वास्तव में एक गिनती प्रकार है) द्वारा तेज़ सॉर्टिंग के लिए उपयुक्त है। IDate वास्तव में तेजी से (आमतौर पर एक बंद) रूपांतरण होने का लक्ष्य नहीं रखता है।

तो स्ट्रिंग दिनांक/समय, सही या गलत रूपांतरित करने के लिए, मैं अपना स्वयं का सहायक कार्य रोल करने लगता हूं।

यदि स्ट्रिंग दिनांक "2012-12-24" है तो मैं as.integer(gsub("-", "", col)) की तरफ झुकता हूं और YYYYMMDD पूर्णांक तिथियों के साथ आगे बढ़ता हूं। इसी प्रकार एक पूर्णांक के रूप में HHMMDD हो सकता है। दो कॉलम: date और time अलग-अलग उपयोगी हो सकते हैं यदि आप आम तौर पर एक दिन के भीतर roll = TRUE करना चाहते हैं, लेकिन पिछले दिन नहीं। महीने तक ग्रुपिंग सरल और तेज़ है: by = date %/% 100L। दिनों को जोड़ना और घटाना मुश्किल है, लेकिन यह वैसे भी है क्योंकि शायद ही कभी आप कैलेंडर दिन, सप्ताहांत या व्यावसायिक दिनों को जोड़ना चाहते हैं। तो यह वैसे भी आपके व्यापार दिवस वेक्टर के लिए एक लुकअप है।

आपके मामले में चरित्र माह को 1:12 पर रूपांतरण की आवश्यकता होगी। आपकी तिथियों में एक विभाजक नहीं है "01APR2008", इसलिए substring महीने के नाम पर match या fmatch के बाद एक ही तरीका होगा। क्या आप फ़ाइल प्रारूप के नियंत्रण में हैं? यदि ऐसा है, तो संख्याएं एक स्पष्ट प्रारूप में बेहतर होती हैं जो स्वाभाविक रूप से %Y-%m-%d, या %Y%m%d जैसी होती है।

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

आपको क्या लगता है? बीटीडब्ल्यू, fread पर प्रोत्साहन के लिए धन्यवाद; देखना अच्छा था।

+0

हे मैथ्यू उत्तर देने के लिए धन्यवाद, एक संभावना है कि मुझे col.cassv तर्क को read.csv में अनुमति देने की अनुमति होगी। आखिरकार आप अपने स्वयं के प्रारूप को इंगित कर सकते हैं (उदाहरण के लिए मैंने किसी अन्य पोस्ट से लिया गया उदाहरण) 'आर) setAs (" वर्ण "," myDate ", फ़ंक्शन (से) as.Date (से, प्रारूप ="% d/% एम /% वाई "))' 'आर) system.time (डेटा <- read.csv (फ़ाइल = filePath, sep ="; ", स्ट्रिंग्सएफ़ैक्टर्स = TRUE, colClasses = c (" कारक "," कारक " , "संख्यात्मक", "myDate"), nrows = 10)); ' – statquant

+0

इसके अतिरिक्त मुझे लगता है कि यदि आप पैकेज में माइक्रोसेकंद रिज़ॉल्यूशन समय जोड़ सकते हैं तो आप बहुत अधिक व्यक्ति को स्पर्श करेंगे। सभी HFTraders/quants इस सामान के साथ खेल रहे हैं ... (तर्कसंगत रूप से उन्हें इसके लिए आर का उपयोग नहीं करना चाहिए, लेकिन चलो वहाँ नहीं जाना चाहिए) – statquant

+0

सहमत है, 'colClasses' पहले से ही सूची में है (करने के लिए सूची को फ्रेड के शीर्ष पर है । सी), लेकिन एक नामित वेक्टर के रूप में उन सभी को निर्दिष्ट करने की आवश्यकता के बजाय विशेष कॉलम को ओवरराइड करने की अनुमति देता है। यह वास्तव में डिफ़ॉल्ट के बारे में एक सवाल था। मुझे लगता है कि, 'POSIXct'। यह पहले से ही माइक्रोसॉन्ड का समर्थन करता है इसलिए मुझे नहीं लगता कि कुछ विशेष 'डेटा.table' को वास्तव में समर्थन करने की आवश्यकता है, iiuc (फ्रेड के अलावा उन्हें सीधे और जल्दी लोड कर सकते हैं)। मुख्य कारण मैं फ्रेड करना चाहता था, दोहरी सीमांकित फाइलों (सीपी 2) के लिए था, हालांकि, जीनोमिक्स में। –

1

मुझे नहीं पता कि आपकी फ़ाइल कैसे संरचित है, लेकिन आपकी टिप्पणी से आप दिनांक फ़ील्ड को कुंजी के रूप में उपयोग करना चाहते हैं। इसे एक समय श्रृंखला के रूप में क्यों नहीं पढ़ा जाए और इसे पढ़ने में प्रारूपित क्यों करें?

यहाँ मैं चिड़ियाघर का उपयोग यह करने के लिए। (यहाँ मुझे लगता है कि उस तारीख स्तंभ पहले एक है, अन्यथा index.colum तर्क को देखने)

ff <- function(x) as.POSIXct(strptime(x,"%d%b%Y:%H:%M:%S")) 

h <- read.zoo(text = "03avril2008:09:00:00 125 
         02avril2008:09:30:00 126 
         05avril2008:09:10:00 127 
         04avril2008:09:20:00 128 
         01avril2008:09:00:00 128" 
         ,FUN=ff) 

आप अपनी तिथियाँ सही प्रारूप में सॉर्ट और हल कर मिलता है।

रूपांतरण POSIXct से IDateTime

IDateTime(index(h)) 
     idate itime 
1: 2008-04-01 09:00:00 
2: 2008-04-02 09:30:00 
3: 2008-04-03 09:00:00 
4: 2008-04-04 09:20:00 
5: 2008-04-05 09:10:00 

यहाँ यकीन है कि आप अभी भी 2 रूपांतरण करने के लिए स्वाभाविक है, लेकिन आप यह कर जब डाटा पढ़ने, और दूसरा आप किसी भी प्रारूप समस्या से निपटने के बिना करते हैं।

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