Как определить, имеет ли столбец в 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