正确检查Pandas DataFrame索引类型是否为DatetimeIndex的方法
在下面的代码中,我想检查数据框中的 index
是否是 DatetimeIndex
类型。这种做法对吗?有没有比用 if
语句更好的方法?看起来很简单,但我在想我是不是漏掉了什么。
我想这样做是因为我预见到用户有时可能不会读取带有相应日期信息的 data
。
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
案例 2
df = pd.DataFrame(data, index=index)
type(df.index) == pd.tseries.index.DatetimeIndex
正确返回: True
提前谢谢你们。我希望这不是个太简单的问题。
3 个回答
根据我从这篇帖子(@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中更广泛的用例。
更稳妥的方法是使用 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中断言列的数据类型
截至2021年,这里是检查这个问题的最新方法:
>>> df.index.inferred_type == "datetime64"
>>> True
所以你可以在你的应用程序中添加类似这样的代码:
assert df.index.inferred_type == 'datetime64', "must have a datetime index"
谢谢!