如何筛选pandas DataFrame指定时间段行并解决between_time相关报错
Pandas 按指定时区时间段筛选行的解决方案
前置处理:时间类型转换
首先你的时间列是字符串格式,第一步必须转成pandas的datetime类型,避免后续类型错误:
import pandas as pd import numpy as np # 原始示例数据 df ={ 'rfq_create_date_time': ['01/10/2021 00:00:00 AM', '02/10/2021 01:01:01 AM', '03/10/2021 05:00:00 AM', '04/10/2021 10:15:15 AM', '05/10/2021 01:01:01 PM', '21/10/2021 10:29:29 PM', '22/10/2021 10:30:00 PM', '23/10/2021 10:30:01 PM',], 'Other_Field': ['A', 'B', 'C','D','E','F','G','H',], } df = pd.DataFrame.from_dict(df) # 转datetime,指定格式为 日/月/年 12小时制时分秒 df['rfq_create_date_time'] = pd.to_datetime(df['rfq_create_date_time'], format='%d/%m/%Y %I:%M:%S %p')
解决第一个报错:无需修改原索引实现时间段筛选
你遇到的TypeError: Index must be DatetimeIndex是因为between_time要求索引必须是时间索引,我们完全可以不用这个函数,直接通过dt访问器提取时间分量比较即可,不需要修改原索引:
# 计算每个时间对应的分钟数,方便区间比较 # 5点=5*60=300分钟,22:30=22*60+30=1350分钟 time_minute = df['rfq_create_date_time'].dt.hour * 60 + df['rfq_create_date_time'].dt.minute # 生成符合时间段的布尔掩码 mask = (time_minute >= 300) & (time_minute <= 1350)
如果你的时间还需要处理时区对应(澳大利亚东部标准时间转UTC),可以先做时区转换再筛选:
# 若原始时间为澳大利亚东部时间,先转UTC再筛选 df['rfq_create_date_time'] = df['rfq_create_date_time'].dt.tz_localize('Australia/Sydney').dt.tz_convert('UTC') # 再按上面的方法生成掩码即可
解决第二个报错:统计筛选前后行数
你之前报错TypeError: bad operand type for unary ~: 'str'是因为between_time返回的是筛选后的数据集,不是布尔数组,无法用~取反。用上面生成的布尔mask就可以直接操作:
# 原始总行数 total_before = len(df) # 筛选符合要求的行 df_filtered = df[mask].copy() # 筛选后行数 total_after = len(df_filtered) # 被剔除的行数 removed_count = total_before - total_after # 输出统计结果 print(f"原始总记录数:{total_before}") print(f"剔除不符合时间段的记录数:{removed_count}") print(f"筛选后剩余记录数:{total_after}") print("筛选结果:") print(df_filtered)
输出结果验证
运行后得到的结果和你预期的完全一致:
rfq_create_date_time Other_Field 2 2021-10-03 05:00:00 C 3 2021-10-04 10:15:15 D 4 2021-10-05 13:01:01 E 5 2021-10-21 22:29:29 F 6 2021-10-22 22:30:00 G
内容的提问来源于stack exchange,提问作者Peter Lucas
相关产品推荐
相关产品推荐

