Pandas DatetimeIndex 索引数据类型:datetime64 与时间戳

Pandas DatetimeIndex indexing dtype: datetime64 vs Timestamp

索引一个 pandas DatetimeIndex(使用 dtype numpy datetime64[ns])returns 要么:

令人困惑的部分是时间戳不等于 np.datetime64,因此:

import numpy as np
import pandas as pd

a_datetimeindex = pd.date_range('1/1/2016', '1/2/2016', freq = 'D')
print np.in1d(a_datetimeindex[0], a_datetimeindex)

Returns 错误。但是:

print np.in1d(a_datetimeindex[0:1], a_datetimeindex)
print np.in1d(np.datetime64(a_datetimeindex[0]), a_datetimeindex)

Returns 正确的结果。

我猜这是因为 np.datetime64[ns] 精确到纳秒,但时间戳被截断了?

我的问题是,有没有一种方法可以创建 DatetimeIndex,使其始终索引到相同(或可比)的数据类型?

您正在使用 numpy 函数来操作 pandas 类型。它们并不总是兼容的。

函数np.in1d首先将它的两个参数都转换为ndarrays。 DatetimeIndex 有一个内置的转换,返回一个 dtype np.datetime64 的数组(它是 DatetimIndex.values)。但是 Timestamp 没有这样的设施,它没有被转换。

相反,您可以使用 python 关键字 in(最自然的方式):

a_datetimeindex[0] in a_datetimeindex

或用于元素集合的Index.isin方法

a_datetimeindex.isin(a_list_or_index)

如果您想使用 np.in1d,请将两个参数显式转换为 numpy 类型。或者在底层的 numpy 数组上调用它:

np.in1d(a_datetimeindex.values[0], a_datetimeindex.values)

或者,将 np.in1d 与两个相同类型的集合一起使用可能是安全的:

np.in1d(a_datetimeindex, another_datetimeindex)

甚至

np.in1d(a_datetimeindex[[0]], a_datetimeindex)