You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从DataFrame中筛选出7点至11点(含)的行?

解决DataFrame筛选7:00-11:00(含两端)数据的问题

问题描述

需求是从DataFrame中筛选出时间处于上午7点到11点(包含两端)的所有行。已执行数据读取与预处理代码:

df = pd.read_csv('info.csv')
amount_df = pd.DataFrame(df['amount'])
datetime_df = pd.DataFrame((pd.to_datetime(df['datetime'])).dt.time)
concat_df = pd.concat([datetime_df, amount_df], axis=1)

但执行以下筛选代码后,无法包含时间恰好为11:00:00的记录:

mask = (df['datetime'].dt.hour <= 6) & (df['datetime'].dt.hour >= 11)
concat_df = concat_df[~mask]

原代码问题分析

  1. 逻辑条件错误:(df['datetime'].dt.hour <=6) & (df['datetime'].dt.hour >=11) 是互斥条件,不可能同时成立,因此mask全为False,~mask会选中所有行;若实际是误将&写为|,则mask会选中小时≤6或≥11的行,~mask会排除11点的记录,这就是11:00:00无法被包含的核心原因。
  2. datetime类型处理疏漏:仅临时转换df['datetime']生成datetime_df,未将原df['datetime']转为datetime类型,后续使用dt.hour可能引发错误(若原列仍为字符串格式)。

正确解决方案

方法一:基于小时数快速筛选

先将datetime列转为datetime类型,再通过小时数范围筛选:

# 转换datetime列为datetime类型
df['datetime'] = pd.to_datetime(df['datetime'])
# 筛选7点到11点(含两端)的行
filtered_df = df[(df['datetime'].dt.hour >= 7) & (df['datetime'].dt.hour <= 11)]

方法二:精确到时分秒的筛选

若需严格匹配7:00:00至11:00:00的时间范围(包含边界),可使用between方法:

# 转换datetime列为datetime类型
df['datetime'] = pd.to_datetime(df['datetime'])
# 定义起止时间
start_time = pd.to_datetime('07:00:00').time()
end_time = pd.to_datetime('11:00:00').time()
# 筛选符合时间范围的行
filtered_df = df[df['datetime'].dt.time.between(start_time, end_time)]

整合到预处理流程中

如果需要保留concat_df的结构,可调整代码如下:

df = pd.read_csv('info.csv')
# 转换datetime列并保留datetime类型
df['datetime'] = pd.to_datetime(df['datetime'])
# 筛选目标时间范围
filtered_df = df[(df['datetime'].dt.hour >=7) & (df['datetime'].dt.hour <=11)]
# 构建目标DataFrame
concat_df = filtered_df[['datetime', 'amount']].copy()
# 按需添加仅显示时间的列
concat_df['time'] = concat_df['datetime'].dt.time

内容的提问来源于stack exchange,提问作者Sentitis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:13:16