我试图根据它们是否为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
答案 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)