我有一个两个元素的列表,类型为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)
现在,我如何检查该索引的框架是在所有的日期时间间隔?换句话说,对于每个元素的索引的框架(行)检查该行是否包含在第一个间隔,或在第二个间隔,或在第三个间隔,等等,通过这样做:
for start, end in intervals:
df.index >= start & df.index >= end
我的想法是:
1.为每个区间创建一个布尔掩码,检查索引的每个元素是否都在区间内
masks = [
[False, True, True, False],
[False, False, False, False],
[False, False, False, False],
]
1.通过应用|(逻辑或)运算符
mask = [False, True, True, False]
我希望以矢量化的方式执行1和2,因此我希望尽可能使用numpy或pandas。我目前正在使用Python中的列表管理数据结构。哪一条路最快,哪一条路最优雅?
2条答案
按热度按时间huwehgph1#
您可以使用
IntervalIndex
和get_indexer_for
来识别现有的匹配,然后使用all
来聚合:输出:
False
工作原理:
检查哪些元素在范围内:
输出:
array([False, True, True, False])
所有组合
如果需要比较所有组合,请使用numpy:
输出量:
dwthyt8l2#
替代方法: