Как определить, имеет ли столбец в pandas датафрейм типа datetime? Как определить, является ли столбец числовым?

Я пытаюсь отфильтровать столбцы в фрейме pandas на основе того, имеют ли они дату типа или нет. Я могу выяснить, какие из них, но тогда придется разбирать этот вывод или вручную выбирать столбцы. Я хочу автоматически выбирать столбцы даты. Вот то, что у меня есть в качестве примера - я бы хотел только выбрать столбец "date_col" в этом случае.

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

Из:

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

Ответ 1

Pandas имеет классную функцию, называемую select_dtypes, которая может принимать либо исключать, либо включать (или оба) в качестве параметров. Он фильтрует dataframe на основе dtypes. Поэтому в этом случае вы хотели бы включить столбцы dtype np.datetime64. Чтобы фильтровать по целым числам, вы должны использовать [np.int64, np.int32, np.int16, np.int] для float: [np.float32, np.float64, np.float16, np.float] для фильтрации только по числовым столбцам: [np.number].

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

Из:

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

В:

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

Из:

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

Ответ 2

бит uglier Альтернатива Numpy:

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

Ответ 3

Я только столкнулся с этой проблемой и обнаружил, что ответ @charlie-haley не достаточно общий для моего случая использования. В частности, np.datetime64, похоже, не соответствует datetime64[ns, UTC].

df['date_col'] = pd.to_datetime(df['date_str'], utc=True)
print(df.date_str.dtype)  # datetime64[ns, UTC]

Вы также можете расширить список dtypes, включив в него другие типы, но это не кажется хорошим решением для будущей совместимости, поэтому я вместо этого использовал функцию is_datetime64_any_dtype из pandas api.

В:

from pandas.api.types import is_datetime64_any_dtype as is_datetime

df[[column for column in df.columns if is_datetime(df[column])]]

Из:

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