Pandas字符串转日期后筛选数据遇类型错误的求助
问题排查与解决
问题根源
- 你将日期列转换为Python原生的
datetime.date对象后,pandas会将该列识别为object类型,而非pandas优化的datetime64[ns]类型。 - 使用
loc[startdate:enddate]时,pandas默认会尝试匹配整数行索引,导致把datetime.date实例当作整数比较,触发类型不兼容错误。
解决方案
方案1:使用pandas原生datetime类型(推荐)
保留datetime64[ns]类型,充分利用pandas对时间序列的优化支持,可通过布尔索引或索引切片实现筛选:
import pandas as pd x = pd.DataFrame([ "4/11/2022", "6/16/2022", "12/18/2021", "11/13/2020", "5/17/2023" ], columns = ["My Date"]) # 转换为pandas原生datetime64[ns]类型,无需转成date对象 x["My Date"] = pd.to_datetime(x["My Date"], errors='coerce') # 定义起止日期(同样用pandas datetime类型) startdate = pd.to_datetime("2021-1-1") enddate = pd.to_datetime("2022-1-1") # 方法A:布尔索引筛选(直观易懂) filtered_data = x[(x["My Date"] >= startdate) & (x["My Date"] < enddate)] # 方法B:将日期设为索引后用loc切片 x.set_index("My Date", inplace=True) filtered_data = x.loc[startdate:enddate]
方案2:坚持使用Python date对象(不推荐)
若必须保留datetime.date类型,需用布尔索引替代loc切片,避免索引类型冲突:
import pandas as pd import datetime x = pd.DataFrame([ "4/11/2022", "6/16/2022", "12/18/2021", "11/13/2020", "5/17/2023" ], columns = ["My Date"]) x["My Date"] = pd.to_datetime(x["My Date"], errors='coerce').dt.date startdate = datetime.date(2021, 1, 1) enddate = datetime.date(2022, 1, 1) # 布尔索引筛选,直接比较date对象 filtered_data = x[(x["My Date"] >= startdate) & (x["My Date"] < enddate)]
注意事项
pandas的datetime64[ns]类型针对时间序列操作做了大量优化,运算速度、功能支持都远优于object类型存储的Python原生date对象,建议优先使用方案1。
内容的提问来源于stack exchange,提问作者sergey_208
相关产品推荐
相关产品推荐

