Pandas存储超2262年日期时astype转换datetime.date失败求助
解决Pandas存储超2262年日期及astype类型转换问题
为什么astype()无法识别datetime.date?
Pandas的astype()虽文档提及支持Python数据类型,但实际上没有为datetime.date提供对应原生dtype。当你用apply生成datetime.date对象的列时,该列实际是object dtype(Python对象的存储容器),astype()无法直接将列转换为datetime.date类型——Pandas更倾向于使用基于numpy的datetime64系列类型作为时间相关列的标准类型。
可行解决方案
方案1:保留object dtype存储datetime.date对象,调整强制转换规则
apply执行后,col2已经是存储datetime.date对象的object列,无需再用astype(datetime.date)转换。修改强制转换代码:
# 不对col2做类型转换,或明确指定为object data.astype(dtype={"col1": str, "col2": object})
既满足强制转换要求,又能保留datetime.date对象。
方案2:使用datetime64[D]类型(支持超大范围日期)
numpy的datetime64类型范围由时间单位决定,datetime64[D](天级单位)的时间覆盖范围远超9999年,完全避开nanosecond级的限制:
import pandas as pd import numpy as np data = pd.DataFrame({"col1": ["2022-12-31", "9999-12-31"]}) # 转换为datetime64[D]类型 data["col2"] = pd.to_datetime(data["col1"]).dt.floor('D').astype('datetime64[D]') # 强制类型转换时指定对应dtype data.astype(dtype={"col1": str, "col2": "datetime64[D]"})
此方案下还能正常使用Pandas的dt访问器进行日期操作。
方案3:存储为字符串类型(简单直接)
若无需复杂日期运算,直接存字符串可彻底避免范围限制:
data = pd.DataFrame({"col1": ["2022-12-31", "9999-12-31"]}) data["col2"] = data["col1"].astype(str) # 强制转换时指定str类型 data.astype(dtype={"col1": str, "col2": str})
后续需要时,可通过datetime.date.fromisoformat()将字符串转回日期对象。
关于dt.to_pydatetime()报错的说明
dt访问器仅支持Pandas原生的datetime64类型列,无法用于存储Pythondatetime.date对象的object列。改用方案2的datetime64[D]类型后,即可正常使用该方法。
内容的提问来源于stack exchange,提问作者mcenno
相关产品推荐
相关产品推荐

