如何将pandas dataframe的object类型列转换为日期类型并解决越界报错
报错原因
- 代码列名引用错误:你需要转换的是
timeframe列,但代码中写的是df['Date'],读取的列数据不符合预期 - 日期解析规则匹配错误:
nov-21、jun-90这类英文月份缩写+两位数年份的格式,未指定格式时pandas会默认将其解析为公元1年的日期,远超出pandas纳秒时间戳的支持范围,所以触发越界报错。
解决方法
方法1:指定解析格式+修正年份
如果需要保留完整日期格式,先明确指定解析格式,再对年份做世纪修正即可:
import pandas as pd from datetime import datetime # 明确指定%b-%y格式解析,errors='coerce'会将无法解析的内容转为空值方便排查 df['timeframe'] = pd.to_datetime(df['timeframe'], format='%b-%y', errors='coerce') # 修正年份:解析后年份大于当前年的,默认是上世纪的日期,减去100年即可 current_year = datetime.now().year over_year_mask = df['timeframe'].dt.year > current_year df.loc[over_year_mask, 'timeframe'] = df.loc[over_year_mask, 'timeframe'] - pd.DateOffset(years=100)
如果你的数据全部属于上世纪,可以直接统一减去100年,不需要判断:
df['timeframe'] = pd.to_datetime(df['timeframe'], format='%b-%y', errors='coerce') - pd.DateOffset(years=100)
方法2:转为月度Period类型
如果你只需要存储年月信息,不需要具体到日,直接转为月度Period类型可以完全避免时间戳越界问题:
df['timeframe'] = pd.to_datetime(df['timeframe'], format='%b-%y').dt.to_period('M')
内容的提问来源于stack exchange,提问作者Gangadhar Dixit
相关产品推荐
相关产品推荐

