Python 如何判断pandas数据帧中的列是否为datetime类型?如何判断列是否为数字?

Python 如何判断pandas数据帧中的列是否为datetime类型?如何判断列是否为数字?,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我试图根据pandas数据框中的列是否为date类型来过滤它们。我可以找出哪些是,但随后必须解析该输出或手动选择列。我想自动选择日期列。这里是我迄今为止的一个例子——在本例中,我只想选择“date\u col”列 import pandas as pd df = pd.DataFrame([['Feb-2017', 1, 2], ['Mar-2017', 1, 2], ['Apr-2017', 1, 2],

我试图根据pandas数据框中的列是否为date类型来过滤它们。我可以找出哪些是,但随后必须解析该输出或手动选择列。我想自动选择日期列。这里是我迄今为止的一个例子——在本例中,我只想选择“date\u 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
输出:


Pandas有一个很酷的函数,名为select_dtypes,可以将exclude或include或两者都作为参数。它根据数据类型过滤数据帧。因此,在本例中,您希望包括dtype np.datetime64的列。要按整数过滤,您可以使用[np.int64,np.int32,np.int16,np.int]作为浮点:[np.float32,np.float64,np.float16,np.float],只按数值列过滤:[np.number]

输出:

在:

输出:


更丑陋的裸体替代品:

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

我刚刚遇到这个问题,发现@charlie haley的答案对于我的用例来说不够笼统。尤其是np.datetime64似乎与datetime64[ns,UTC]不匹配

df['date\u col']=pd.to\u datetimedf['date\u str'],utc=True printdf.date\u str.dtype datetime64[ns,UTC] 您还可以扩展数据类型列表以包括其他类型,但这似乎不是一个很好的解决方案,无法满足未来的兼容性,因此我最终使用了pandas api中的is_datetime64_any_数据类型函数

在:

从pandas.api.types导入的是\u datetime 64 \u任何\u数据类型 df[[column for column in df.columns if is_datetimedf[column]]] 输出:

日期 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
此代码自动标识日期列,并将数据类型从object更改为“datetime64[ns]”。一旦获得日期数据类型,就可以轻松地执行其他操作

for col in data.columns:
    if data[col].dtype == 'object':
        try:
            data[col] = pd.to_datetime(data[col])
        except ValueError:
            pass

最近我需要检查列中的任何元素是日期还是数字

我的方法是,尝试转换为datetime或numeric类型,然后检查是否有任何元素为null

pd.to_datetime( data_temp.eval('col_name'), format='%d/%m/%Y', errors='coerce')
输出:

0   2010-09-16
1   2010-09-16
2   2018-06-04
3          NaT
4          NaT
5   2018-11-30
numpy.bool_
bool
然后使用isnull检查元素是否可以转换

pd.to_datetime( data_temp.eval('col_name'), format='%d/%m/%Y', errors='coerce').isnull().any()
这将返回True,因为最后一个元素为null/NaT

检查数字

data_temp.eval('col_name').astype(str).str.isnumeric().all()
如果列上的所有元素都是数字,则返回True

两者都将返回一个numpy.bool\ux,但如果需要,可以很容易地将其转换为bool

type(pd.to_datetime( data_temp.eval(name), format='%d/%m/%Y', errors='coerce').isnull().any())
输出:

0   2010-09-16
1   2010-09-16
2   2018-06-04
3          NaT
4          NaT
5   2018-11-30
numpy.bool_
bool
-

输出:

0   2010-09-16
1   2010-09-16
2   2018-06-04
3          NaT
4          NaT
5   2018-11-30
numpy.bool_
bool

这应该适用于包含时区信息的datetime。在这里,我将最初存储为对象的datetime对象转换为datetime,然后对其进行本地化

我的初始日期时间值如下所示

2021-06-15 23:35:00+05:30

对于zipdata.dtypes.index、data.dtypes.values中的i、j: 如果typej==pd.core.dtypes.dtypes.DatetimeTZDtype: 数据[i]=pd.to_datetimedata[i],utc=True 数据[i]=数据[i].dt.tz_convertz='Asia/Kolkata' 数据[i]=数据[i].dt.tz_localizetz=None
尽管它严格来说是正确的,但我想指出,此解决方案不检测datetime.date字段