You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将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

火山引擎 最新活动