检查日期是否在数据框中 pandas
checking if a date falls in a dataframe pandas
我有一个日期数据框:
>>> d.head()
Out[55]:
0 2010-06-01
1 2010-06-02
2 2010-06-03
3 2010-06-04
4 2010-06-07
dtype: datetime64[ns]
我无法检查其中是否包含给定日期:
>>> d.iloc[1]
Out[59]: Timestamp('2010-06-02 00:00:00')
>>> d.iloc[1] in d
Out[60]: False
>>> np.datetime64(d.iloc[1]) in d
Out[61]: False
>>> d.iloc[1] in pd.to_datetime(d)
Out[62]: False
>>> pd.to_datetime(d.iloc[1]) in pd.to_datetime(d)
Out[63]: False
最好检查什么?
回答下面的一些评论:
使用值无法解决问题:
>>> d.iloc[1] in d.values
Out[69]: False
我不认为这是 iloc 返回行而不是值的问题
>>> x= pd.Timestamp('2010-6-2')
>>> x
Out[72]: Timestamp('2010-06-02 00:00:00')
>>> x in d
Out[73]: False
>>> x in pd.to_datetime(d)
Out[74]: False
>>> x in d.values
Out[75]: False
试试这个。您正在将 pd.Series
的第一个值与列中的值进行比较,这当然是 True
.
我认为您的比较不起作用的原因是 in
operator acting on pd.Series
checks for existence in the series index,而不是系列值本身。应用 set
确保系列值用于比较。
# df
# date
# 0 2010-06-01
# 1 2010-06-02
# 2 2010-06-03
# 3 2010-06-04
# 4 2010-06-07
# convert date column to datetime
df.date = pd.to_datetime(df.date)
df.date[1] in set(df.date)
这是我在反复试验中得到的一个可能的答案,不确定我是否遗漏了什么。
检查 d 表明它是 dtype datetime64[ns]
>>> d.head()
Out[55]:
0 2010-06-01
1 2010-06-02
2 2010-06-03
3 2010-06-04
4 2010-06-07
dtype: datetime64[ns]
同样发生在 d.values
>>> d.values
Out[76]:
array(['2010-05-31T20:00:00.000000000-0400', '2010-06-01T20:00:00.000000000-0400',.....], dtype='datetime64[ns]')
但只检查其中一项会将其更改为时间戳。
>>> d.iloc[1]
Out[82]: Timestamp('2010-06-02 00:00:00')
所以我这样做了:
>>> x= pd.Timestamp('2010-6-2')
>>> x
Out[72]: Timestamp('2010-06-02 00:00:00')
>>> np.datetime64(x) in d.values
Out[77]: True
检查 @jp_data_analysis 使用 set 的建议也有效,因为它将格式保持为时间戳
>>> set(d.iloc[:])
Out[81]:
{Timestamp('2015-10-13 00:00:00'),
Timestamp('2011-07-18 00:00:00'),......
>>> x in set(d.iloc[:])
Out[83]: True
您可以使用 .isin
执行以下操作(请注意 .isin 确实需要一个列表作为输入):
df.date = pd.to_datetime(df.date)
df.date.isin([df.date.iloc[1]])
我有一个日期数据框:
>>> d.head()
Out[55]:
0 2010-06-01
1 2010-06-02
2 2010-06-03
3 2010-06-04
4 2010-06-07
dtype: datetime64[ns]
我无法检查其中是否包含给定日期:
>>> d.iloc[1]
Out[59]: Timestamp('2010-06-02 00:00:00')
>>> d.iloc[1] in d
Out[60]: False
>>> np.datetime64(d.iloc[1]) in d
Out[61]: False
>>> d.iloc[1] in pd.to_datetime(d)
Out[62]: False
>>> pd.to_datetime(d.iloc[1]) in pd.to_datetime(d)
Out[63]: False
最好检查什么?
回答下面的一些评论:
使用值无法解决问题:
>>> d.iloc[1] in d.values
Out[69]: False
我不认为这是 iloc 返回行而不是值的问题
>>> x= pd.Timestamp('2010-6-2')
>>> x
Out[72]: Timestamp('2010-06-02 00:00:00')
>>> x in d
Out[73]: False
>>> x in pd.to_datetime(d)
Out[74]: False
>>> x in d.values
Out[75]: False
试试这个。您正在将 pd.Series
的第一个值与列中的值进行比较,这当然是 True
.
我认为您的比较不起作用的原因是 in
operator acting on pd.Series
checks for existence in the series index,而不是系列值本身。应用 set
确保系列值用于比较。
# df
# date
# 0 2010-06-01
# 1 2010-06-02
# 2 2010-06-03
# 3 2010-06-04
# 4 2010-06-07
# convert date column to datetime
df.date = pd.to_datetime(df.date)
df.date[1] in set(df.date)
这是我在反复试验中得到的一个可能的答案,不确定我是否遗漏了什么。
检查 d 表明它是 dtype datetime64[ns]
>>> d.head()
Out[55]:
0 2010-06-01
1 2010-06-02
2 2010-06-03
3 2010-06-04
4 2010-06-07
dtype: datetime64[ns]
同样发生在 d.values
>>> d.values
Out[76]:
array(['2010-05-31T20:00:00.000000000-0400', '2010-06-01T20:00:00.000000000-0400',.....], dtype='datetime64[ns]')
但只检查其中一项会将其更改为时间戳。
>>> d.iloc[1]
Out[82]: Timestamp('2010-06-02 00:00:00')
所以我这样做了:
>>> x= pd.Timestamp('2010-6-2')
>>> x
Out[72]: Timestamp('2010-06-02 00:00:00')
>>> np.datetime64(x) in d.values
Out[77]: True
检查 @jp_data_analysis 使用 set 的建议也有效,因为它将格式保持为时间戳
>>> set(d.iloc[:])
Out[81]:
{Timestamp('2015-10-13 00:00:00'),
Timestamp('2011-07-18 00:00:00'),......
>>> x in set(d.iloc[:])
Out[83]: True
您可以使用 .isin
执行以下操作(请注意 .isin 确实需要一个列表作为输入):
df.date = pd.to_datetime(df.date)
df.date.isin([df.date.iloc[1]])