2016-01-25 12 views
7

मैं डेटाफ़्रेम में JSON फ़ाइलों को पढ़ रहा हूं। डेटाफ्रेम में कुछ स्ट्रिंग (ऑब्जेक्ट) प्रकार कॉलम हो सकते हैं, कुछ न्यूमेरिक (int64 और/या float64), और कुछ डेटाटाइम प्रकार कॉलम हो सकते हैं। जब डेटा पढ़ा जाता है, डेटाटाइप अक्सर गलत होता है (यानी डेटाटाइम, int और float अक्सर "ऑब्जेक्ट" प्रकार के रूप में संग्रहीत किया जाएगा)। मैं इस संभावना पर रिपोर्ट करना चाहता हूं। (यानी एक कॉलम डेटा ऑब्जेक्ट में "ऑब्जेक्ट" (स्ट्रिंग) के रूप में है, लेकिन यह वास्तव में एक "डेटाटाइम" है)।पाइथन पांडस कॉलम डेटाटाइप

समस्या मेरे पास है कि यह निर्भर करता है समाप्त होता है जब मैं pd.to_numeric और pd.to_datetime वे दोनों का मूल्यांकन करें और स्तंभ को परिवर्तित करने की कोशिश करेंगे, और कई बार का उपयोग है की जिस पर दो मैं आखिरी कॉल करता हूं ... (मैं convert_objects() का उपयोग करने जा रहा था जो काम करता है लेकिन यह अवमूल्यन है, इसलिए बेहतर विकल्प चाहिए)।

कोड मैं dataframe स्तंभ का मूल्यांकन करने का उपयोग कर रहा है (मैं एहसास नीचे का एक बहुत बेमानी है, लेकिन मैं इसे पठनीयता के लिए इस तरह से लिखा है):

try: 
    inferred_type = pd.to_datetime(df[Field_Name]).dtype 
    if inferred_type == "datetime64[ns]": 
     inferred_type = "DateTime" 
except: 
    pass 
try: 
    inferred_type = pd.to_numeric(df[Field_Name]).dtype 
    if inferred_type == int: 
     inferred_type = "Integer" 
    if inferred_type == float: 
     inferred_type = "Float" 
except: 
    pass 
+1

यह इतनी शर्म की बात है कि इसे बहिष्कृत किया गया है। यह एक शानदार तरीका है। –

+0

convert_objects को [infer_objects] (https://pandas-docs.github.io/pandas-docs-travis/generated/pandas.DataFrame.infer_objects.html) द्वारा बहिष्कृत किया गया है – itzjustricky

+0

@itzjustricky infer_objects भी पहचान नहीं पाएंगे [' 1 ',' 2 ',' 3 '] संख्यात्मक होने के नाते। पीडी। डेटाफ्रेम (['1', '2', '3'])। Infer_objects()। Dtypes "ऑब्जेक्ट" – PabTorre

उत्तर

0

उदा

df['field_name'] = df['field_name'].astype(np.float64) 

(यह सोचते हैं कि import numpy as np)

+0

धन्यवाद देता है। मैं उपर्युक्त रणनीति का उपयोग कर डेटाटाइम की जांच कैसे कर सकता हूं? – Calamari

+0

'df ['field_name'] = pd.to_datetime (df ['field_name'])' – zebralove79

+0

अभी भी एक ही समस्या का सामना कर रहा है। कॉलम दोनों डेटाटाइम और फ्लोट प्रकार के रूप में मूल्यांकन करने में सक्षम होने लगते हैं। – Calamari

1

वैकल्पिक रूप से: पांडा आप स्पष्ट रूप डेटाटाइप्स परिभाषित करने के लिए जब एक dataframe बनाने की अनुमति देता है। आप कॉलम नामों के साथ एक शब्दकोश में कुंजी के रूप में वांछित कुंजी और डेटा प्रकार के रूप में पास करते हैं।

मानक निर्माता

या आप डेटा फ्रेम में आयात करने

जैसे के बाद स्तंभ के प्रकार डाल सकता के लिए Documentation Here: df['field_name'] = df['field_name'].astype(np.date_time)

0

एक समाधान यह dtypes अनुमान लगाने के लिए प्राप्त करने के लिए इसे पाने के लिए है StringIO का उपयोग कर एक CSV को डेटा लिखने के लिए, और फिर इसे वापस पढ़ें।

0

मुझे इनकमिंग डेटा के लिए कॉलम प्रकारों को समझने की एक ही समस्या आई, जहां पहले से ज्ञात नहीं है ... मेरे मामले में पढ़ने वाले डीबी से। SO पर अच्छा जवाब नहीं मिला, या पांडा स्रोत कोड की समीक्षा करके। इसे इस फ़ंक्शन का उपयोग करके हल करें:

def _get_col_dtype(col): 
     """ 
     Infer datatype of a pandas column, process only if the column dtype is object. 
     input: col: a pandas Series representing a df column. 
     """ 


     if col.dtype =="object": 

      # try numeric 
      try: 
       col_new = pd.to_datetime(col.dropna().unique()) 
       return col_new.dtype 
      except: 
       try: 
        col_new = pd.to_numeric(col.dropna().unique()) 
        return col_new.dtype 
       except: 
        try: 
         col_new = pd.to_timedelta(col.dropna().unique()) 
         return col_new.dtype 
        except: 
         return "object" 

     else: 
      return col.dtype 
संबंधित मुद्दे