如何将Excel列读取为datetime.datetime以解决pandas日期筛选报错
解决Pandas读取Excel日期为datetime.time类型无法筛选的问题
我来帮你搞定这个日期转换和筛选的难题——之前我也碰到过类似的Excel日期序列号被误解析的情况,咱们一步步捋清楚:
问题根源
你提到的5位数字(比如42636)是Excel的日期序列号,代表从1900年1月1日开始的天数(Excel有个小bug:误把1900年当成了闰年,所以实际转换时基准要往前推2天)。但因为Excel单元格格式设置或者pandas的自动解析逻辑,这列被错误识别成了datetime.time类型,导致没法和datetime.datetime做比较。
解决方案步骤
1. 正确读取并转换日期序列号
先把列强制读取为数值类型,再转换为标准的datetime64[ns]类型:
import pandas as pd from datetime import datetime # 第一步:读取文件时强制Sub_End为数值类型,避免被自动解析成time Subadvisory_Advisor_Fires = pd.read_excel( 'SOLO_Advisor_Data.xlsx', sheet_name='Advisor_Fires', dtype={'Sub_End': float} # 用float兼容可能带小数的日期(如果包含时间部分) ) # 第二步:将Excel日期序列号转换为datetime # origin='1899-12-30'是为了抵消Excel的1900闰年bug Subadvisory_Advisor_Fires['Sub_End'] = pd.to_datetime( Subadvisory_Advisor_Fires['Sub_End'], origin='1899-12-30', unit='D' ) # 验证转换结果:应该输出datetime64[ns] print(Subadvisory_Advisor_Fires['Sub_End'].dtype)
2. 执行日期范围筛选
转换完成后,就可以正常使用between或者比较运算符进行筛选了:
Start_Datetime = datetime(2016, 12, 31) End_Datetime = datetime(2018, 12, 31) # 方法一:使用between简化写法 Advisor_Fires = Subadvisory_Advisor_Fires[Subadvisory_Advisor_Fires['Sub_End'].between(Start_Datetime, End_Datetime)] # 方法二:使用比较运算符,逻辑更直观 Advisor_Fires = Subadvisory_Advisor_Fires[ (Subadvisory_Advisor_Fires['Sub_End'] >= Start_Datetime) & (Subadvisory_Advisor_Fires['Sub_End'] <= End_Datetime) ]
为什么之前的方法失败?
- 指定
dtype={'Sub_End': date}或datetime.datetime无效:pandas读取Excel时,会优先根据单元格的格式解析数据,dtype参数主要用于文本/数值类型,对日期时间类型的解析优先级更低。 - 使用
converters={'Sub_End': pd.to_datetime}报错:此时传入pd.to_datetime的是已经被解析成datetime.time的对象,而pd.to_datetime无法直接将time类型转换为datetime。
内容的提问来源于stack exchange,提问作者MBA Coder




