numpy 如何判断pandas dataframe中的列是否为datetime类型?如何判断列是否为数值类型?

i7uaboj4  于 2023-04-12  发布在  其他
关注(0)|答案(6)|浏览(221)

我尝试根据pandas dataframe中的列是否为date类型来过滤它们。我可以找出哪些是date类型,但之后必须解析输出或手动选择列。我想自动选择date列。以下是我目前为止的示例-在这种情况下,我只想选择'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
raogr8fs

raogr8fs1#

我刚刚遇到这个问题,发现@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的列表来包含其他类型,但是这似乎不是一个很好的解决方案,所以我最终使用了pandas API中的is_datetime64_any_dtype函数。
在:

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
qv7cva1a

qv7cva1a2#

Pandas有一个很酷的函数select_dtypes,它可以接受exclude或include(或两者)作为参数。它根据dtypes过滤 Dataframe 。所以在这种情况下,你会希望包含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
holgip5t

holgip5t3#

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
dbf7pr2w

dbf7pr2w4#

此代码自动识别日期列并将数据类型从object更改为'datetime64[ns]'。一旦您获得日期数据类型,您就可以轻松执行其他操作。

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

pb3skfrl5#

最近我需要检查列中是否有任何元素是日期或数字
我的方法是,尝试转换为类型(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

然后使用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_,但如果需要,可以很容易地将其转换为bool

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

输出:

numpy.bool_

--

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

输出:

bool
gmol1639

gmol16396#

这应该适用于有时区信息的日期时间。这里我转换一个日期时间对象(最初存储为对象),首先转换为日期时间,然后我将其本地化。
我的初始日期时间值如下所示
2021-06-15 23:35:00+05:30

for i,j in zip(data.dtypes.index,data.dtypes.values):
    if type(j) ==  pd.core.dtypes.dtypes.DatetimeTZDtype:
        data[i] = pd.to_datetime(data[i],utc=True)
        data[i] = data[i].dt.tz_convert(tz='Asia/Kolkata')
        data[i] = data[i].dt.tz_localize(tz=None)

相关问题