Pandas处理Excel中字符串格式datetime列的筛选问题
解决Excel字符串datetime列筛选当日6:00-23:00数据的问题
原方法问题分析
第一种方法失效原因
- 索引设置错误:
pd.read_excel中指定index_col=9,如果第9列恰好是ingezameldop,该列会被设为DataFrame的索引,无法通过data['ingezameldop']访问,导致筛选条件未实际生效。 - 缺少日期筛选:仅通过
dt.time.between筛选时间范围,未限定日期为当日,若原数据中大部分记录的时间都在6:00-23:00区间内,输出结果会和原文件一致。
第二种方法问题
截取小时部分后未完成有效筛选逻辑:字符串类型的两位小时(如'06'、'15')可直接用>=/<=比较,但格式不统一时(如单数字小时)容易出错;更可靠的方式是转换为整数后再进行范围判断。
修正后的解决方案
方案一:利用pandas datetime类型(推荐)
通过将字符串列转换为datetime类型,同时筛选日期和时间范围,逻辑清晰且不易出错:
import pandas as pd from datetime import date # 读取Excel,避免误设索引导致目标列无法访问 df = pd.read_excel('inzamelbestand.xlsx') # 将字符串列转换为datetime类型 df['ingezameldop'] = pd.to_datetime(df['ingezameldop']) # 获取今日日期 today = date.today() # 组合筛选条件:日期为今日,且时间在6:00-23:00之间 filter_mask = (df['ingezameldop'].dt.date == today) & \ (df['ingezameldop'].dt.time.between(pd.to_datetime('06:00:00').time(), pd.to_datetime('23:00:00').time())) # 应用筛选并保存结果 filtered_df = df.loc[filter_mask] filtered_df.to_excel("oefenexcel.xlsx", index=False)
方案二:字符串截取(适合特殊场景)
如果坚持用字符串操作,需完善小时筛选逻辑,确保比较的准确性:
import pandas as pd from datetime import date df = pd.read_excel('inzamelbestand.xlsx') # 获取今日的日部分(如2024-05-20对应'20') today_str = str(date.today()) target_day = today_str[-2:] # 筛选当日数据:匹配字符串中的日部分 df = df.loc[df['ingezameldop'].str[8:10] == target_day] # 筛选6:00-23:00的数据:截取小时部分转整数后判断范围 df = df.loc[df['ingezameldop'].str[11:13].astype(int).between(6, 23)] # 保存结果 df.to_excel("oefenexcel.xlsx", index=False)
内容的提问来源于stack exchange,提问作者kucb
相关产品推荐
相关产品推荐

