给定两个时间戳的列表列表,如何检查数据帧的索引是否在这些日期时间范围内?

问题描述 投票:0回答:1

我有一个由两个类型为

pd.Timestamp
的元素组成的列表,例如:

intervals = [
    [pd.Timestamp('2023-01-01 02:00:00'), pd.Timestamp('2023-01-01 03:00:00')], 
    [pd.Timestamp('2023-01-01 05:00:00'), pd.Timestamp('2023-01-01 07:00:00')],
    [pd.Timestamp('2023-01-01 07:30:00'), pd.Timestamp('2023-01-01 08:00:00')],
]

我还有一个示例数据框,例如:

data = {'value': [1, 2, 3, 4]}
index = [
    pd.Timestamp('2023-01-01 01:00:00'),
    pd.Timestamp('2023-01-01 02:00:00'), 
    pd.Timestamp('2023-01-01 03:00:00'),
    pd.Timestamp('2023-01-01 04:00:00'),
]
df = pd.DataFrame(data, index=index)

现在,如何检查数据帧的索引是否在所有日期时间间隔内? 我的想法是:

  1. 为每个区间创建一个布尔掩码,检查索引的每个元素是否在区间内
  2. 通过应用 &(逻辑与)运算符将上述掩码列表减少为单个掩码

我希望以矢量化方式执行 1 和 2,因此我想尽可能使用 numpy 或 pandas。目前我正在使用列表管理 Python 中的数据结构。哪一种是最快的方法,哪一种也是最优雅的方法?

python pandas numpy reduce mask
1个回答
0
投票

您可以使用

IntervalIndex

idx = pd.IntervalIndex.from_tuples(list(map(tuple, intervals)))

out = (idx.get_indexer_for(df.index) != -1).all()

输出:

False

工作原理:

idx.get_indexer_for(df.index)
# array([-1, -1,  0, -1])

# check if values are found
idx.get_indexer_for(df.index) != -1
# array([False, False,  True, False])

# are all values found?
(idx.get_indexer_for(df.index) != -1).all()
# False
© www.soinside.com 2019 - 2024. All rights reserved.