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

时间:2017-04-04 17:47:55

标签: python pandas numpy dataframe

我试图根据它们是否为date类型来过滤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

6 个答案:

答案 0 :(得分:15)

Pandas有一个名为select_dtypes的酷函数,可以将exclude或include(或两者)作为参数。它根据dtypes过滤数据帧。因此,在这种情况下,您需要包含dtype np.datetime64列。要按整数进行过滤,您可以使用[np.int64, np.int32, np.int16, np.int] for 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

答案 1 :(得分:3)

有点丑陋的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

答案 2 :(得分:0)

我刚遇到此问题,发现@ 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]

您还可以扩展dtype的列表以包括其他类型,但这似乎并不是将来兼容性的好解决方案,因此我最终使用了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

答案 3 :(得分:0)

此代码自动识别日期列,并将数据类型从对象更改为“ datetime64 [ns]”。获得日期数据类型后,您可以轻松执行其他操作。

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

答案 4 :(得分:0)

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

我的方法是,尝试转换为类型(日期时间或数字),然后检查是否有任何元素为空

NSTableView

输出:

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()

这将返回 True ,因为最后一个元素为null / NaT

要检查数字

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

如果列上的所有元素均为数字,则返回 True

两者都将返回 numpy.bool _ ,但是如果需要,可以轻松将其转换为bool

data_temp.eval('col_name').astype(str).str.isnumeric().all()

输出:

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()))

答案 5 :(得分:0)

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

我的初始日期时间值看起来像这样

<块引用>

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

df_list = [i[1] for i in df_sec.groupby(df_sec['day'])]
# elements of the generator are tuples like (number, dataframe)