2012-12-13 62 views
7

मेरे पास इस gist में दिखाई देने वाला डेटा है और मैं डेटा को numpy के साथ निकालने का प्रयास कर रहा हूं। तो मैं निम्नलिखित कोडnumpy.genfromtxt datetime.strptime कनवर्टर

import numpy as np 
from datetime import datetime 

convertfunc = lambda x: datetime.strptime(x, '%H:%M:%S:.%f') 
col_headers = ["Mass", "Thermocouple", "T O2 Sensor",\ 
       "Igniter", "Lamps", "O2", "Time"] 
data = np.genfromtxt(files[1], skip_header=22,\ 
        names=col_headers,\ 
        converters={"Time": convertfunc}) 

कहाँ के रूप में सार में देखा जा सकता वहाँ हैडर सामग्री के 22 पंक्तियों के साथ ऐसा करने की कोशिश की मैं नहीं बल्कि अजगर करने के लिए नया हूँ। IPython में, जब मैं "रन" निम्नलिखित कोड मैं एक त्रुटि है जो निम्न के साथ समाप्त होता प्राप्त करते हैं:

TypeError: float() argument must be a string or a number 

पूर्ण IPython त्रुटि ट्रेस here देखा जा सकता है।

मैं संख्यात्मक डेटा के छः कॉलम निकालने में सक्षम हूं, जैसे कि gencomtxt जैसे usecols = range (0,6) के लिए तर्क का उपयोग करके ठीक है, लेकिन जब मैं अंतिम कॉलम को आजमाने और निपटाने के लिए कनवर्टर का उपयोग करने का प्रयास करता हूं स्टम्प्ड। किसी भी और सभी टिप्पणियों की सराहना की जाएगी!

+0

read_table का उपयोग करने का प्रयास करें, जो प्रकार को स्वतः पहचानने का ख्याल रखता है। –

उत्तर

6

ऐसा इसलिए हो रहा है क्योंकि np.genfromtxt एक फ्लोट सरणी बनाने की कोशिश कर रहा है, जो विफल रहता है क्योंकि convertfunc एक डेटाटाइम ऑब्जेक्ट देता है, जिसे फ्लोट के रूप में नहीं डाला जा सकता है। सबसे आसान समाधान केवल dtype='object' से np.genfromtxt को ऑब्जेक्ट सरणी बनाने और फ़्लोट करने के लिए रूपांतरण को रोकने के लिए तर्क को पास करना होगा। हालांकि, इसका मतलब यह होगा कि अन्य कॉलम स्ट्रिंग के रूप में सहेजे जाएंगे। उन्हें फ़्लोट के रूप में सही तरीके से सहेजने के लिए आपको structured array प्राप्त करने के लिए प्रत्येक के dtype निर्दिष्ट करने की आवश्यकता है। यहाँ मैं उन सब सेट कर रहा हूं अंतिम स्तंभ है, जो एक वस्तु dtype हो जाएगा छोड़कर दोगुना करने के लिए:

In [74]: data['Mass'] 
Out[74]: array([ 0.262 , 0.2618, 0.2616, 0.2614]) 
In [75]: data['Time'] 
Out[75]: array([1900-01-01 15:49:24.546000, 1900-01-01 15:49:25.171000, 
       1900-01-01 15:49:25.405000, 1900-01-01 15:49:25.624000], 
       dtype=object) 
:

dd = [(a, 'd') for a in col_headers[:-1]] + [(col_headers[-1], 'object')] 
data = np.genfromtxt(files[1], skip_header=22, dtype=dd, 
        names=col_headers, converters={'Time': convertfunc}) 

यह आपको एक संरचित सरणी आप नाम आप दे दी है साथ उपयोग कर सकते हैं जो दे देंगे

+0

धन्यवाद। ऐसा लगता है कि यह बहुत अच्छा काम करता है। मैं स्पष्टीकरण की सराहना करता हूं! –

4

आप पांडा read_table उपयोग कर सकते हैं:

import pandas as pd 
    frame=pd.read_table('/tmp/gist', header=None, skiprows=22,delimiter='\s+') 

मेरे लिए काम किया। आपको हेडर को अलग से संसाधित करने की आवश्यकता है क्योंकि वे अलग-अलग स्थान की भिन्न संख्या हैं।