检查Pandas DataFrame索引是否为特定类型(DatetimeIndex)的正确方法

15
在下面的代码中,我想检查数据帧中的index是否为DatetimeIndex类型。这样做的方式正确吗?有没有比使用if语句更好的方法?这看起来很简单,但我想知道是否还有其他需要注意的地方。
我想这样做是因为我预见到用户偶尔可能没有读取相应的日期信息。
import pandas as pd
data = {'x' : [1,2,3],
    'y' : [4,5,6]}

index = pd.date_range("2014-1-1", periods=3, freq="D")

案例1

df = pd.DataFrame(data)
type(df.index) == pd.tseries.index.DatetimeIndex

正确返回:False

第二种情况

df = pd.DataFrame(data, index=index)
type(df.index) == pd.tseries.index.DatetimeIndex

正确地返回:True

提前感谢。希望这不会太琐碎。


6
你可以使用isinstance(df.index, pd.DatetimeIndex)来判断一个DataFrame的索引是否为DatetimeIndex类型。 - joris
6
如果你知道它是一个索引,你就可以使用“index.is_all_dates”来判断是否所有的日期都在里面。 - Jeff
@joris 感谢提供的信息。我是否正确地认为这些更受欢迎是因为它们更简洁,还是有其他原因? - dpk
1
请参考以下链接:https://dev59.com/bXI_5IYBdhLWcg3wDOhC - joris
3个回答

12
截至2021年,以下是检查此内容的最新方法:
>>> df.index.inferred_type == "datetime64"
>>> True

因此,您可以将以下内容添加到应用程序中:

assert df.index.inferred_type == 'datetime64', "must have a datetime index"

干杯


1

更健壮的方式是使用 pandas.api.types,例如 ptypes.is_datetime64_any_dtype

例如,

import pandas.api.types as ptypes

ptypes.is_datetime64_dtype(df.index)
ptypes.is_numeric_dtype(df.index)
ptypes.is_string_dtype(df.index)

这与 Pandas 中 断言列数据类型 的答案相关。


0

帖子(由@joris在评论中提到)和其他来源中我发现,有几种方法可以做到这一点,尽管每种方法都对特定情况有用。

在我的情况下,我尝试创建自己的函数来显示有关DataFrame或Series的信息,具体取决于输入参数。

当您运行type(df.index)时,您将获得输出,例如<class 'pandas.core.indexes.range.RangeIndex'><class 'pandas.core.indexes.datetimes.DatetimeIndex'>

如果您刚刚从CSV或其他源导入数据并且尚未为df设置索引,则可以使用“RangeIndex”来检查它:

if isinstance(df.index, pandas.core.indexes.range.RangeIndex): print('yes')
if type(df.index) is pandas.core.indexes.range.RangeIndex: print('yes')

我也尝试过字符串输出,它也可以工作,但是Python程序员不建议这样做,虽然在特定情况下它可能很有用:

if str(type(df.index)) == "<class 'pandas.core.indexes.range.RangeIndex'>": 
    print('type of index is RangeIndex:',type(df.index))

在您的情况下,只需使用

if isinstance(df.index, pandas.core.indexes.datetimes.DatetimeIndex): 
    print('here I want to do something because my index is DatetimeIndex')

注意:如果您在脚本中将pandas导入为pd,请在上面的代码中使用pd.core...

获取对象类名的简单解决方案:df.index.__class__.__name__

因此,您可以检查if df.index.__class__.__name__ == 'DatetimeIndex': 'do something'

这个'对象类型'的答案涵盖了Python中更广泛的用例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接