Python datetime.datetime 不在 pandas._libs.tslibs.timestamps.Timestamp 系列中

Python datetime.datetime not in series of pandas._libs.tslibs.timestamps.Timestamp

我不明白为什么在我的日期时间系列中找不到我的日期时间:

X.key_datetime
Timestamp('2018-12-23 22:34:00')

df['Y'][0]
Timestamp('2018-12-23 22:34:00')

类型:

type(X.key_datetime)
class 'datetime.datetime'

type(df['Y'])
class 'pandas.core.series.Series'

type(df['Y'][0])
class 'pandas._libs.tslibs.timestamps.Timestamp'

我的日期时间等于系列中的第一个日期时间,但它不在系列中

X.key_datetime == df['Y'][0]
True

X.key_datetime in df['Y']
False

X.key_datetime in df['Y'].values
False

使用 pd.to_datetime 进行转换时,我仍然遇到同样的问题:

pd.to_datetime(X.key_datetime) == pd.to_datetime(df['Y'][0])
True

pd.to_datetime(X.key_datetime) in pd.to_datetime(df['Y'])
False

深入研究 pandas 代码,归结为通用 Series class 的设置方式。 __contains__ 方法(in 调用的方法)检查​​ _info_axis 属性。此属性由此处显示的 _setup_axes 方法设置:https://github.com/pandas-dev/pandas/blob/v0.25.3/pandas/core/series.py#L4883

长话短说,Seriesin 方法检查 Series 对象的 index。下面举几个例子来说明。

import pandas as pd

df = pd.DataFrame({'Y': ['2019-11-15', '2019-11-16'], 'Z':['abc', 'def']})
df['Y'] = pd.to_datetime(df.Y)

y = df.Y[0]
y in df.Y
# returns:
False

'abc' in df.Z
# returns:
False

这很奇怪,但你要记住,我们正在检查系列 YZindex,也就是 RangeIndex(start=0, stop=2, step=1)。如果我们检查索引中的值,我们会看到:

0 in df.Y, 1 in df.Z
# returns: 
(True, True)

要检查一个系列是否包含一个值,我会使用:

df.Y.eq(y).any()

或者在您的具体情况下:

class X:
    def __init__(self, *args):
        self.key_datetime = datetime.datetime(*args)

x = X(2019, 11, 15)

df.Y.eq(x.key_datetime).any()
# returns:
True