我惊讶地发现pandas.DatetimeTZDtype
与numpy.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