首页 > 解决方案 > 如何检查时间戳列表的元素是否在包含时间戳的系列中?

问题描述

问题:

我想检查 pandas.Timestamps 列表的哪些条目在数据框的 pandas.Timestamp 系列中。问题是,当我使用in运算符检查列表中的值是否在系列中时,即使特定值在系列中,也会返回一个空列表。

代码:

  1. 时间戳列表:
dates_range = pd.date_range(start="2019-01-01", end="2019-01-31")
type(dates_range[0]) # pandas._libs.tslibs.timestamps.Timestamp
  1. 包含时间戳的系列:
type(_2019["dates"]) # pandas.core.series.Series
type(_2019["dates"].iloc[0]) # pandas._libs.tslibs.timestamps.Timestamp
  1. dates_range比较和的第一个值_2019["dates"]
_2019["dates"].iloc[0] == dates_range[0] # True
  1. 症结:
dates_range[0] in _2019["dates"] # False

def get_dates_that_exist(data, datetime_arr):
    return [date for date in datetime_arr if date in data["dates"]] # Returns []

为什么会这样?如何检查 dates_range 列表中的哪些日期在 _2019["dates"] 中?

标签: pythonpandas

解决方案


首先检查使用 in 运算符

在 Series 上使用 Python in 运算符测试索引中的成员资格,而不是值之间的成员资格。

因此,如果要测试是否至少有一个True用于比较布尔掩码的第一个值并添加Series.any

(_2019["dates"] == dates_range[0]).any()

range如果匹配至少一个值,则测试所有数据Series.isin

_2019["dates"].isin(dates_range).any()

我想知道有哪些价值观

DataFrame.loc与 一起使用boolean indexing

matched = _2019.loc[_2019["dates"].isin(dates_range), 'dates']

如果需要所有列:

df1 = _2019[_2019["dates"].isin(dates_range)]

推荐阅读