为什么熊猫。DatetimeTZDtype compare 等于 numpy.dtype( "O" )?这是意料之中的吗?



我惊讶地发现pandas.DatetimeTZDtypenumpy.dtype("O"):相比是相等的

>>> numpy.dtype("O") == pandas.DatetimeTZDtype
True

我在一次单元测试中遇到了这个问题,一次测试出乎意料地通过了。

这是意料之中的平等,还是应该将其视为一个bug?我在DatetimeTZDtype文档中找不到它的文档,在pandas或numpy中也找不到描述它的问题;但这可能是一些(历史(设计考虑的副作用。

检查文档:

pd.DatetimeTZDtype(
unit: Union[str, ForwardRef('DatetimeTZDtype')] = 'ns',
tz=None,
)
Docstring:     
An ExtensionDtype for timezone-aware datetime data.
**This is not an actual numpy dtype**, but a duck type.

而类继承则完全不同:

In [162]: type(np.dtype('O')).__mro__
Out[162]: (numpy.dtype[object_], numpy.dtype, object)
In [163]: pd.DatetimeTZDtype.__mro__
Out[163]: 
(pandas.core.dtypes.dtypes.DatetimeTZDtype,
pandas.core.dtypes.dtypes.PandasExtensionDtype,
pandas.core.dtypes.base.ExtensionDtype,
object)

我不确定==测试是在哪里定义的。对于numpy,对象dtype是一个catch-all,所有不是定义的dtype的东西(数字、字符串等(。

In [186]: np.dtype('O').__eq__(pd.core.dtypes.base.ExtensionDtype)
Out[186]: True

因此,以下DatetimeTSDtype文档,制作:

In [202]: dt = pd.DatetimeTZDtype(tz='UTC')

有了它,我可以制作一个系列:

In [203]: S = pd.Series(["2020-10-01"],dtype=dt)
In [204]: S
Out[204]: 
0   2020-10-01 00:00:00+00:00
dtype: datetime64[ns, UTC]

但当我要求numpy等效物时:

In [205]: S.to_numpy()
Out[205]: array([Timestamp('2020-10-01 00:00:00+0000', tz='UTC')], dtype=object)

我无法使用dt:制作阵列

In [206]: np.array("2020-10-01",dtype=dt)
Traceback (most recent call last):
File "<ipython-input-206-c3b73b03da08>", line 1, in <module>
np.array("2020-10-01",dtype=dt)
TypeError: Cannot interpret 'datetime64[ns, UTC]' as a data type

最新更新