Pandas按Pass_ID分组并筛选特定时段的唯一Pass_ID
解决方案
可以通过以下简洁步骤实现需求:
步骤1:定义目标时间范围
先创建时间对象来表示10:00和13:00的边界:
import pandas as pd # 假设你的DataFrame名为df,且Date_Time已转为datetime类型 start_time = pd.Timestamp("10:00:00").time() end_time = pd.Timestamp("13:00:00").time()
步骤2:标记符合时段的记录
为每条记录添加一个布尔列,标记其时间是否在目标范围内:
df['in_window'] = df['Date_Time'].dt.time.between(start_time, end_time)
步骤3:分组筛选仅全时段符合的Pass_ID
按Pass_ID分组,检查组内所有记录的in_window是否都为True,然后提取符合条件的ID:
valid_pass_ids = df.groupby('Pass_ID')['in_window'].all() valid_pass_ids = valid_pass_ids[valid_pass_ids].index.tolist()
完整代码示例
import pandas as pd # 构造示例数据(模拟你的数据集) data = { 'Date_Time': [ '3/30/23 05:12:36.36', '3/30/23 05:12:38.38', '3/30/23 05:12:40.40', '3/30/23 05:12:42.42', '3/30/23 05:12:44.44', '3/30/23 12:12:50.50', '3/30/23 12:12:52.52', '3/30/23 12:12:54.54', '3/30/23 12:12:56.56', '3/30/23 12:12:58.58', '3/30/23 12:13:00.00', '3/30/23 12:13:02.02', '3/31/23 20:02:02.02', '3/31/23 20:02:05.05' ], 'Pass_ID': ['A']*5 + ['B']*7 + ['C']*2, 'El': [1,2,3,4,4,3,4,5,6,7,8,9,3,4] } df = pd.DataFrame(data) df['Date_Time'] = pd.to_datetime(df['Date_Time']) # 定义时间范围 start_time = pd.Timestamp("10:00:00").time() end_time = pd.Timestamp("13:00:00").time() # 标记符合时段的记录 df['in_window'] = df['Date_Time'].dt.time.between(start_time, end_time) # 筛选仅全时段符合的Pass_ID valid_pass_ids = df.groupby('Pass_ID')['in_window'].all()[lambda x: x].index.tolist() print("符合条件的Pass_ID:", valid_pass_ids) # 输出:符合条件的Pass_ID: ['B']
说明
- 用
dt.time提取时间部分,避免日期干扰,只关注一天中的时段 groupby('Pass_ID')['in_window'].all()返回每个Pass_ID对应的布尔值,表示该ID的所有记录是否都在目标时段内- 最后通过索引筛选出布尔值为
True的Pass_ID,得到所需结果
内容的提问来源于stack exchange,提问作者earnric
相关产品推荐
相关产品推荐

