如何按时间范围筛选DataFrame子集?按ID最小时间加1小时筛选
实现按id筛选最小时间后1小时内数据的方法
我来帮你搞定这个Pandas数据筛选的需求!核心思路就是按id分组,找到每个组的最早时间,然后筛选出该组中时间在最早时间之后1小时内的所有行。下面给你三种实用的实现方法:
方法一:分组计算+合并筛选(逻辑清晰易理解)
这种方法步骤明确,适合刚接触Pandas的同学,每一步都能看到中间结果:
import pandas as pd # 构造示例输入DataFrame df = pd.DataFrame({ 'id': [1,1,1,2,2,2,3,3,3,3], 'time': [1468696537,1468696637,1482007490,1471902849,1471902850,1483361074,1474207754,1474207744,1471446673,1471446693] }) # 1. 按id分组,计算每个id的最小时间 min_time_per_id = df.groupby('id')['time'].min().reset_index(name='min_time') # 2. 将每个id的最小时间合并回原数据 df_with_min = df.merge(min_time_per_id, on='id') # 3. 筛选时间在[最小时间, 最小时间+3600秒]范围内的行 result = df_with_min[(df_with_min['time'] >= df_with_min['min_time']) & (df_with_min['time'] <= df_with_min['min_time'] + 3600)] # 4. 保留需要的列并输出 result = result[['id', 'time']] print(result)
方法二:使用transform函数(代码更紧凑)
transform函数可以直接将分组计算的结果广播到每一行,省去合并步骤,代码更简洁:
import pandas as pd df = pd.DataFrame({ 'id': [1,1,1,2,2,2,3,3,3,3], 'time': [1468696537,1468696637,1482007490,1471902849,1471902850,1483361074,1474207754,1474207744,1471446673,1471446693] }) # 给每行添加对应id的最小时间 df['min_time'] = df.groupby('id')['time'].transform('min') # 筛选范围并清理列 result = df[(df['time'] >= df['min_time']) & (df['time'] <= df['min_time'] + 3600)][['id', 'time']] print(result)
方法三:分组apply自定义函数(适合扩展复杂逻辑)
如果后续需要调整筛选规则,这种方法把分组筛选逻辑封装成函数,可读性和扩展性都很好:
import pandas as pd df = pd.DataFrame({ 'id': [1,1,1,2,2,2,3,3,3,3], 'time': [1468696537,1468696637,1482007490,1471902849,1471902850,1483361074,1474207754,1474207744,1471446673,1471446693] }) # 定义分组筛选函数 def filter_within_hour(group): earliest_time = group['time'].min() # 筛选时间在最早时间到最早时间+1小时内的行 return group[(group['time'] >= earliest_time) & (group['time'] <= earliest_time + 3600)] # 分组应用函数并重置索引 result = df.groupby('id').apply(filter_within_hour).reset_index(drop=True) print(result)
输出结果
三种方法都会得到你期望的子集:
id time 0 1 1468696537 1 1 1468696637 2 2 1471902849 3 2 1471902850 4 3 1471446673 5 3 1471446693
内容的提问来源于stack exchange,提问作者Nata
相关产品推荐
相关产品推荐

