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

如何检查时间戳与时段匹配性并删除不匹配的数据行

DataFrame时段数据过滤需求

我有一个包含timestamps字段的DataFrame,需要根据用户选择的时段(Morning/Evening)删除不匹配的数据行,规则如下:

  • 若时间戳处于06:00-12:00且daytime字段为Evening,删除该行
  • 若时间戳处于18:00-00:00且daytime字段为Morning,删除该行

示例数据

df
timestamps          daytime
2020-04-10 11:40    Morning
2022-04-12 19:32    Morning *(需删除)*
2022-04-12 20:53    Evening
2022-04-15 22:50    Morning *(需删除)*
2022-04-16 09:31    Evening*(需删除)*

我尝试的代码

remove = df[ (6< df['timestamp'].dt.hour < 12  & df['period'] == 'Evening') 
| (18< df['timestamp'].dt.hour < 23  & df['period'] == 'Morning')]
df.drop(remove , inplace=True)

问题分析与修正代码

你的代码存在几个问题:

  1. Python布尔索引中不能直接用6 < x < 12这种连续比较写法,需拆分为两个独立条件并用&连接
  2. 字段名不匹配:DataFrame里的字段是daytime,但代码中写的是period
  3. 时间范围覆盖不全:规则要求覆盖18:00-00:00,代码只写到23点,漏掉了0点的情况

修正后的代码

# 提取时间戳的小时部分,简化后续判断
df['hour'] = df['timestamps'].dt.hour

# 定义需要删除的行的条件
delete_condition = (
    # 06:00-12:00 且 daytime为Evening
    ((df['hour'] >= 6) & (df['hour'] < 12) & (df['daytime'] == 'Evening'))
    |
    # 18:00-00:00 且 daytime为Morning(覆盖18点及以后、0点的情况)
    ((df['hour'] >= 18) | (df['hour'] == 0)) & (df['daytime'] == 'Morning')
)

# 保留不需要删除的行
df = df[~delete_condition]
# 也可以用drop方法:df.drop(df[delete_condition].index, inplace=True)

补充说明

  • 提前提取hour字段既能让代码更清晰,也能避免重复调用dt.hour带来的性能损耗
  • 用~delete_condition对删除条件取反,直接保留符合要求的数据行,逻辑更直观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:10:54