如何从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]
原代码问题分析
- 逻辑条件错误:
(df['datetime'].dt.hour <=6) & (df['datetime'].dt.hour >=11)是互斥条件,不可能同时成立,因此mask全为False,~mask会选中所有行;若实际是误将&写为|,则mask会选中小时≤6或≥11的行,~mask会排除11点的记录,这就是11:00:00无法被包含的核心原因。 - 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
相关产品推荐
相关产品推荐

