pandas.read_csv使用parse_dates参数时超2150年日期无法解析如何解决
问题根因
pandas默认使用datetime64[ns](纳秒精度)类型存储日期时间,受64位整数存储上限限制,该类型可表示的时间范围仅为1677年9月到2262年4月。当待解析的日期年份超出该范围时,内置的自动日期解析逻辑会失败,对应列就会保留为object类型的字符串,你观测到的2150年阈值属于该范围边界附近的测试表现。
可行解决方案
方案1:指定日期格式解析
如果不需要使用pandas datetime的向量化操作,可直接指定日期格式完成解析:
- pandas 2.0及以上版本可直接传入
date_format参数:
import pandas as pd df = pd.read_csv('files/Test_Excep.csv', delimiter=",", parse_dates= ['col1_date','col2_date','col3_dt'], date_format="%Y-%m-%d")
- 低版本pandas可传入自定义解析函数:
from datetime import datetime import pandas as pd custom_date_parser = lambda x: datetime.strptime(x, "%Y-%m-%d") df = pd.read_csv('files/Test_Excep.csv', delimiter=",", parse_dates= ['col1_date','col2_date','col3_dt'], date_parser=custom_date_parser)
该方案下超出datetime64[ns]范围的日期会转为Python原生datetime对象,依然支持常规的日期比较、年月提取操作。
方案2:转换为低精度datetime64类型
如果需要保留pandas datetime的向量化操作能力,可将日期转换为秒/毫秒精度的datetime64类型,这两类精度的时间范围上限远高于2500年:
import pandas as pd df = pd.read_csv('files/Test_Excep.csv', delimiter=",") date_cols = ['col1_date','col2_date','col3_dt'] for col in date_cols: # 转换为秒精度的datetime64类型 df[col] = pd.to_datetime(df[col], format="%Y-%m-%d").astype('datetime64[s]')
方案3:使用Period类型存储
如果所有日期都没有时间部分,可使用按天精度的Period类型存储,支持更大的年份范围:
import pandas as pd df = pd.read_csv('files/Test_Excep.csv', delimiter=",", dtype={ 'col1_date': 'period[D]', 'col2_date': 'period[D]', 'col3_dt': 'period[D]' })
内容的提问来源于stack exchange,提问作者mssr
相关产品推荐
相关产品推荐

