如何检查时间戳与时段匹配性并删除不匹配的数据行
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)
问题分析与修正代码
你的代码存在几个问题:
- Python布尔索引中不能直接用
6 < x < 12这种连续比较写法,需拆分为两个独立条件并用&连接 - 字段名不匹配:DataFrame里的字段是
daytime,但代码中写的是period - 时间范围覆盖不全:规则要求覆盖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
相关产品推荐
相关产品推荐

