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
长话短说,Series
的 in
方法检查 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
这很奇怪,但你要记住,我们正在检查系列 Y
和 Z
的 index
,也就是 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
我不明白为什么在我的日期时间系列中找不到我的日期时间:
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
长话短说,Series
的 in
方法检查 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
这很奇怪,但你要记住,我们正在检查系列 Y
和 Z
的 index
,也就是 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