测试 Pandas 列是否为日期时间类型

Jos*_*der 1 python numpy pandas

我正在尝试fillna使用合适的变量为每列添加一个。我的目标是尝试在最高级别的通用性上找到列类型:基本上,目前它是 numeric (int/float)、string 或 pandas Timestamp。我知道我可以检测数值或使用字符串numpy.issubdtype类型层次,但我还没有找到一种方法来检测Timestamp。我的解决方案使用iloc[0]and isinstance,但还有更好的方法吗?这是我的代码,大致如下:

for col in df:
    if np.issubdtype(dataframe[col].dtype, np.number):
        df[col] = df[col].fillna(-1)
    elif isinstance(dataframe[col].iloc[0], pd.datetime):
        df[col] = df[col].fillna(pd.to_datetime('1900-01-01'))
    else:
        df[col] = df[col].fillna('NaN')
    return (dataframe.fillna(na_var)
Run Code Online (Sandbox Code Playgroud)

(请注意,我不能使用,df.loc[0, col]因为我的索引并不总是包含 0。)

bex*_*exi 5

形成我,np.issubdtype(df[col].dtype, np.datetime64)做你想做的。

所以把所有的东西放在一起,我们有:

def df_fillna(df):
    for col in df:
        if np.issubdtype(df[col].dtype, np.number):
            df[col] = df[col].fillna(-1)
        elif np.issubdtype(df[col].dtype, np.datetime64):
            df[col] = df[col].fillna(pd.to_datetime('1900-01-01'))
        else:
            df[col] = df[col].fillna('NaN')
        return df
Run Code Online (Sandbox Code Playgroud)

一个例子。输入:

df_test = pd.DataFrame()
df_test['dates'] = [pd.to_datetime("2009-7-23"), pd.to_datetime("2011-7-7"), pd.NaT]
df_test = df_fillna(df_test)
Run Code Online (Sandbox Code Playgroud)

输出:

       dates
0 2009-07-23
1 2011-07-07
2 1900-01-01
Run Code Online (Sandbox Code Playgroud)