我希望根据列的datetime种数据类型 Select 列.例如,我的DataFrame具有类型为np.dtype('datetime64[ns]')np.datetime64'datetime64[ns, UTC]'的列.

有没有一种100方法可以 Select 数据类型为DATETIME的所有列?


例如,这是可行的:

from sklearn.compose import make_column_selector
selector = make_column_selector(dtype_include=(np.dtype('datetime64[ns]'),np.datetime64))
selected_columns = selector(df)

但这不是(来自带有‘UTC’的Pandas DF的数据类型):

from sklearn.compose import make_column_selector
selector = make_column_selector(dtype_include=np.dtype('datetime64[ns, UTC]')
selected_columns = selector(df)

与数字数据类型相比,在数字数据类型中,您可以简单地使用np.number而不是np.int64等.

空气污染指数-参考make_column_selector:LINK

推荐答案

据我所知,没有父类可以像您在np.number中指出的那样,以通用方式捕获所有的DateTime列.

我的猜测是你想在sklearn-pipeline中使用它进行前处理?在这种情况下,您可以使用自定义 Select 器:

# Custom function to check if dtype is a datetime
def is_datetime(dtype):
    dtype_str = str(dtype)
    # Check for timezone-aware and timezone-naive datetimes
    if 'datetime64[ns' in dtype_str or np.issubdtype(dtype, np.datetime64):
        return True
    return False

# Custom function to mimic make_column_selector with custom type checks
def custom_column_selector(df, dtype_checker):
    return [col for col, dtype in df.dtypes.items() if dtype_checker(dtype)]

Test

这是对虚拟DataFrame上的定制 Select 器的简单测试,这些虚拟DataFrame具有不同类型的数据类型,以及具有时区感知和时区初始日期的日期.

# Imports
import pandas as pd
import numpy as np
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder, FunctionTransformer
from sklearn.impute import SimpleImputer
from sklearn import set_config
from sklearn.compose import make_column_selector

# Config
set_config(transform_output="pandas")

# Example DataFrame with mixed dtypes and different datetime types
df = pd.DataFrame({
    'a': range(10),
    'b': pd.to_datetime(range(10), unit='D', origin=pd.Timestamp('2023-01-01')),
    'c': pd.to_datetime(range(10), utc=True),
    'd': pd.Series(pd.date_range("2023-01-01", periods=10)).dt.tz_localize('America/New_York'),
    'e': pd.Series(pd.date_range("2023-01-01", periods=10)).dt.tz_localize('Europe/London'),
    'f': ['cat', 'dog']*5,
    'g': [1.1, 2.2]*5
})

# Custom function to check if dtype is a datetime
def is_datetime(dtype):
    dtype_str = str(dtype)
    # Check for timezone-aware and timezone-naive datetimes
    if 'datetime64[ns' in dtype_str or np.issubdtype(dtype, np.datetime64):
        return True
    return False

# Define the datetime transformer, exchange with whichever you pefer
def extract_year(df):
    return df.apply(lambda x: x.dt.year)

datetime_transformer = Pipeline(steps=[
    ('year', FunctionTransformer(extract_year, validate=False))
])

# Custom column selector function
def custom_column_selector(dtype_checker):
    def selector(df):
        return [col for col, dtype in df.dtypes.items() if dtype_checker(dtype)]
    return selector

# Create preprocessor with transformers
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), make_column_selector(dtype_include=np.number)),
        ('cat', OneHotEncoder(sparse_output=False), make_column_selector(dtype_include=object)),
        ('datetime', datetime_transformer, custom_column_selector(is_datetime))
    ])

# Usage of the preprocessor
data_transformed = preprocessor.fit_transform(df)

After preprocessing:

num__a num__g cat__f_cat cat__f_dog datetime__b datetime__c datetime__d datetime__e
-1.5667 -1 1 0 2023 1970 2023 2023
-1.21854 1 0 1 2023 1970 2023 2023
-0.870388 -1 1 0 2023 1970 2023 2023
-0.522233 1 0 1 2023 1970 2023 2023
-0.174078 -1 1 0 2023 1970 2023 2023
0.174078 1 0 1 2023 1970 2023 2023
0.522233 -1 1 0 2023 1970 2023 2023
0.870388 1 0 1 2023 1970 2023 2023
1.21854 -1 1 0 2023 1970 2023 2023
1.5667 1 0 1 2023 1970 2023 2023

Python相关问答推荐

tempfile.mkstemp(text=.)参数实际上是什么?

如何将uint 16表示为float 16

如何将Matplotlib的fig.add_axes本地坐标与我的坐标关联起来?

使用regex分析具有特定字符的字符串(如果它们存在)

如何在PIL、Python中对图像应用彩色面膜?

Polars:使用列值引用when / then表达中的其他列

优化在numpy数组中非零值周围创建缓冲区的函数的性能

使用polars .滤镜进行切片速度比pandas .loc慢

pandas DataFrame GroupBy.diff函数的意外输出

滚动和,句号来自Pandas列

Python 约束无法解决n皇后之谜

图像 pyramid .难以创建所需的合成图像

基于字符串匹配条件合并两个帧

为什么以这种方式调用pd.ExcelWriter会创建无效的文件格式或扩展名?

如何使用Python以编程方式判断和检索Angular网站的动态内容?

Stacked bar chart from billrame

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

Python+线程\TrocessPoolExecutor

如何在PySide/Qt QColumbnView中删除列

具有相同图例 colored颜色 和标签的堆叠子图