如何为20万行Pandas DataFrame添加日期列且避免OutOfBoundsDatetime错误
解决pandas添加日期列时的OutOfBoundsDatetime错误
错误原因
你的代码触发OutOfBoundsDatetime是因为pandas默认的datetime64[ns]类型存在时间范围限制——它仅能表示1677-09-21至2262-04-11之间的日期。而你要生成的结束日期是今日加200000天,该日期已超出上述范围,因此报错。
解决方案
以下是三种可行的解决方式,可根据需求选择:
1. 使用更低精度的datetime类型(推荐)
通过指定pd.date_range的dtype参数为datetime64[ms](毫秒精度),扩大可表示的时间范围,同时保留pandas的datetime运算能力:
import pandas as pd import datetime df1 = pd.DataFrame(index=range(200000), columns=range(115)) start_date = datetime.date.today() # 直接指定生成200000条日期数据,用毫秒精度存储 df1['date'] = pd.date_range(start=start_date, periods=200000, dtype='datetime64[ms]')
注:这里改用periods参数直接指定行数,避免手动计算end_date的冗余步骤。
2. 用object类型存储原生datetime.date对象
如果仅需存储日期、不需要pandas的datetime运算功能,可以直接生成Python原生datetime.date对象列表,以object类型存入DataFrame:
import pandas as pd import datetime df1 = pd.DataFrame(index=range(200000), columns=range(115)) start_date = datetime.date.today() # 生成日期列表 dates = [start_date + datetime.timedelta(days=i) for i in range(200000)] df1['date'] = dates
这种方式无时间范围限制,但无法使用pd.Series.dt相关的时间操作方法。
3. 使用Period类型存储日期
Period类型支持更宽泛的时间范围,且保留时间运算能力,适合需要处理时间区间的场景:
import pandas as pd import datetime df1 = pd.DataFrame(index=range(200000), columns=range(115)) start_date = datetime.date.today() # 按天频率生成Period数组 df1['date'] = pd.period_range(start=start_date, periods=200000, freq='D')
后续可通过df1['date'].dt.to_timestamp()转换回datetime类型(需确保转换后的日期在ns精度范围内)。
内容的提问来源于stack exchange,提问作者MsA
相关产品推荐
相关产品推荐

