2017-04-04 31 views
7

Próbuję filtrować kolumny w ramce danych pandy na podstawie tego, czy mają one datę typu, czy nie. Mogę dowiedzieć się, które z nich są, ale następnie musiałby parsować to wyjście lub ręcznie wybrać kolumny. Chcę automatycznie wybrać kolumny dat. Oto, co mam do tej pory jako przykład - chciałbym w tym przypadku wybrać tylko kolumnę "date_col".Jak sprawdzić, czy kolumna w ramce danych pandy jest typu datetime? Jak sprawdzić, czy kolumna ma charakter liczbowy?

import pandas as pd 
df = pd.DataFrame([['Feb-2017', 1, 2], 
        ['Mar-2017', 1, 2], 
        ['Apr-2017', 1, 2], 
        ['May-2017', 1, 2]], 
        columns=['date_str', 'col1', 'col2']) 
df['date_col'] = pd.to_datetime(df['date_str']) 
df.dtypes 

Z:

date_str   object 
col1     int64 
col2     int64 
date_col datetime64[ns] 
dtype: object 

Odpowiedz

10

Pandy ma funkcję zwaną zimną select_dtypes, który może mieć bądź wykluczyć lub zawierać (lub obu) jako parametrów. Filtruje on ramkę danych na podstawie dtypów. W takim przypadku należy uwzględnić kolumny dtype np.datetime64. Aby filtrować według liczb całkowitych, należy użyć wartości [np.int64, np.int32, np.int16, np.int] dla float: [np.float32, np.float64, np.float16, np.float], aby filtrować tylko według kolumn numerycznych: [np.number].

df.select_dtypes(include=[np.datetime64]) 

Out:

date_col 
0 2017-02-01 
1 2017-03-01 
2 2017-04-01 
3 2017-05-01 

w:

df.select_dtypes(include=[np.number]) 

Out:

col1 col2 
0 1  2 
1 1  2 
2 1  2 
3 1  2 
1

nieco brzydsze NumPy alternatywa:

In [102]: df.loc[:, [np.issubdtype(t, np.datetime64) for t in df.dtypes]] 
Out[102]: 
    date_col 
0 2017-02-01 
1 2017-03-01 
2 2017-04-01 
3 2017-05-01 

In [103]: df.loc[:, [np.issubdtype(t, np.number) for t in df.dtypes]] 
Out[103]: 
    col1 col2 
0  1  2 
1  1  2 
2  1  2 
3  1  2