2016-01-25 7 views
7

Czytam pliki JSON w ramkach danych. Ramka danych może mieć pewne kolumny typu String (obiekt), niektóre Numeric (int64 i/lub float64) oraz niektóre kolumny typu daty i godziny. Kiedy dane są odczytywane, typ danych jest często niepoprawny (tj. Datetime, int i float będą często przechowywane jako typ "obiekt"). Chcę zgłosić tę możliwość. (tj. kolumna jest w ramce danych jako "obiekt" (String), ale w rzeczywistości jest to "datetime").Python Pandy wnioskujące dane dotyczące kolumn

Problem mam jest to, że podczas korzystania pd.to_numeric i pd.to_datetime będą zarówno oceny i spróbować przekonwertować kolumnę i wielokrotnie kończy się w zależności które z dwa ja nazywam ostatnim ... (miałem zamiar użyć convert_objects() który działa, ale to jest zamortyzowane, więc chciałem lepszą opcję).

Kod używam do oceny kolumnę dataframe jest (i zrealizować wiele niżej jest zbędny, ale pisałem to w ten sposób dla czytelności):

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

To wstyd, że został przestarzały. To wspaniała metoda. –

+0

convert_objects jest przestarzałe przez [infer_objects] (https://pandas-docs.github.io/pandas-docs-travis/generated/pandas.DataFrame.infer_objects.html) nie jest – itzjustricky

+0

@itzjustricky infer_objects nie rozpozna nawet [' 1 ',' 2 ',' 3 '] jako numeryczne. pd.DataFrame (['1', '2', '3']). Infer_objects(). Dtypes zwraca "obiekt" – PabTorre

Odpowiedz

0

Spróbuj na przykład

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

(zakładając, że import numpy as np)

+0

Dzięki. Jak mogę sprawdzić datetime za pomocą powyższej strategii? – Calamari

+0

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

+0

Nadal występuje ten sam problem. Wygląda na to, że kolumny można oceniać jako typy datetime i float. – Calamari

1

Alternatywnie: Pandy pozwala jawnie zdefiniować typy danych podczas tworzenia dataframe. Przekazujesz słownik zawierający nazwy kolumn jako klucz i żądany typ danych jako wartość.

Documentation Here dla standardowego konstruktora

Albo można oddać typ kolumnie po imporcie do ramki danych

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

0

Jednym z rozwiązań, aby ją wyprowadzić dtypes jest je zdobyć zapisać dane do pliku CSV przy użyciu StringIO, a następnie odczytać je.

0

Natknąłem się na ten sam problem z wymyślaniem typów kolumn dla nadchodzących danych, gdzie typ nie jest znany wcześniej ... z bazy danych odczytanej w moim przypadku. Nie można znaleźć dobrej odpowiedzi tutaj na SO, lub przeglądając kod źródłowy pandy. Rozwiązano go, używając tej funkcji:

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