为什么pandas.datetimetzdtype与numpy.dtype(“o”)比较相等?这是预期的吗?

ljsrvy3e  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(313)

我很惊讶地发现 pandas.DatetimeTZDtype 相当于 numpy.dtype("O") :

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

我在一个单元测试中遇到了这个问题,测试意外地通过了。
这是预期的相等,还是应该被视为bug?我在文件中找不到它 DatetimeTZDtype 文档,我也找不到在Pandas或numpy杂志上的一期中描述的文档;但这可能是一些(历史)设计考虑的副作用。

xghobddn

xghobddn1#

检查文档:

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 ,对象数据类型是一个包罗万象的类型,所有不是定义的数据类型(数字、字符串等)。

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

相关问题