Pandas 中按字符串字段分组并筛选指定时间段内的组

浅静同学_8551

浅静同学_8551

2026-06-28

890人浏览

原创

本文介绍如何使用 Pandas 对数据按 Pass_ID 字符串字段分组,并高效筛选出全部记录均落在指定时间区间(如 10:00–13:00)内的组,或至少有一条记录落在该区间内的组,涵盖 between_time、groupby.filter 与时间索引协同使用的最佳实践。

本文介绍如何使用 pandas 对数据按 `pass_id` 字符串字段分组,并高效筛选出**全部记录均落在指定时间区间(如 10:00–13:00)内**的组,或**至少有一条记录落在该区间内**的组,涵盖 `between_time`、`groupby.filter` 与时间索引协同使用的最佳实践。

在时间序列分析中,常需按业务标识(如 Pass_ID)分组后,进一步按“日内的时段”进行逻辑筛选——例如仅保留全天活动都发生在上午 10 点至下午 1 点之间的通行记录。Pandas 提供了灵活且高效的方式实现这一目标,核心在于合理利用 between_time 方法与 groupby().filter() 的组合。

✅ 场景一:获取「至少有一条记录」落在指定时段的 Pass_ID

这是最常用的需求:只要某 Pass_ID 下任意一条记录的时间落在 10:00–13:00 内,就将其纳入结果。推荐做法是临时将 Date_Time 设为索引,再调用 between_time 进行全局时间过滤,最后提取唯一 Pass_ID:

# 确保 Date_Time 是 datetime 类型(若尚未转换)
df["Date_Time"] = pd.to_datetime(df["Date_Time"])

# 提取所有在 10:00–13:00 区间内出现过的 Pass_ID(去重)
pass_ids_in_range = (
    df.set_index("Date_Time")
       .between_time("10:00", "13:00")["Pass_ID"]
       .unique()
)
print(pass_ids_in_range)  # 输出: ['B']

⚠️ 注意:between_time 仅作用于 DatetimeIndex,因此必须先用 set_index("Date_Time");它默认包含边界(闭区间),且对时分秒精度完全兼容(如 12:12:50.50 会被正确识别)。

Pandas Linux版 2.3.3
Pandas Linux版 2.3.3

Pandas 2.3.3 历史版本下载,来自 PyPI 官方发布,适合旧项目兼容、数据分析脚本复现和指定环境安装。

下载

✅ 场景二:获取「全部记录」均落在指定时段的 Pass_ID

若需严格筛选——即某个 Pass_ID 的所有时间戳都必须位于 10:00–13:00 内(如用于校验合规性),则应使用 groupby().filter() 配合自定义逻辑:

filtered_groups = (
    df.groupby("Pass_ID")
      .filter(
          lambda group: len(
              group.set_index("Date_Time").between_time("10:00", "13:00")
          ) == len(group)
      )
)
pass_ids_full_range = filtered_groups["Pass_ID"].unique()
print(pass_ids_full_range)  # 输出: ['B'](因 B 组全部记录均在此区间)

该逻辑等价于:“对每个 Pass_ID 分组,检查其 between_time 返回的行数是否等于原组总行数”。若相等,说明该组无一例外地满足时间约束。

? 补充技巧与注意事项

  • 避免重复设索引:若 Date_Time 已是索引,可直接调用 .between_time(),无需 set_index;
  • 跨日处理安全:between_time 按“当日时分”匹配,不考虑日期部分,因此 2023-03-30 12:00 和 2023-03-31 12:00 均会被捕获;
  • 性能提示:对大数据集,优先使用 set_index + between_time(底层优化),而非逐行 dt.hour.between() 判断;
  • 扩展用法:若需多时段(如早高峰 07:00–09:00 或晚高峰 17:00–19:00),只需多次调用 between_time 并 concat 或 isin 即可。

综上,between_time 与 groupby.filter 的组合,兼顾简洁性与语义清晰度,是 Pandas 时间范围分组筛选的推荐范式。掌握二者协同逻辑,可快速应对各类基于“日周期时段”的业务分组过滤需求。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1651

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4044

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1649

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

23357

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2867

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2907

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1143

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2243

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Pandas 官方文档与用户指南
Pandas 官方文档与用户指南

共0课时 | 0人学习

Pandas 教程
Pandas 教程

共15课时 | 1.9万人学习