如何生成1-1-1至9999-12-31万年日期?pandas date_range返回空列表
问题根源
你代码跑不出结果有两个核心原因:
- pandas默认使用纳秒精度的
datetime64[ns]类型存储时间,支持的时间范围仅为1677-09-21到2262-04-11,公元1年远早于这个下限,因此无法正常生成序列。 - 传参的日期格式不规范,
'31/12/1999'是日/月/年写法,pandas默认解析逻辑容易识别出错,统一用YYYY-MM-DD格式传参最稳妥。
可行实现方法
方法1:pandas 2.0及以上版本直接指定时间单位
pandas 2.0开始支持非纳秒级的时间存储精度,指定unit参数为秒级(s)或者天级(D),就能把支持的时间范围扩展到覆盖公元1年到9999年,生成效率很高:
import pandas as pd # 生成公元1年1月1日到9999年12月31日的日频日期序列 date_df = pd.date_range( start='0001-01-01', end='9999-12-31', freq='D', unit='s' )
方法2:兼容低版本pandas的标准库生成方案
如果用的是2.0以下的pandas版本,可以先用Python标准库datetime遍历生成日期,再转成pandas序列:
from datetime import datetime, timedelta import pandas as pd start_date = datetime(1, 1, 1) end_date = datetime(9999, 12, 31) day_delta = timedelta(days=1) date_list = [] current_date = start_date while current_date <= end_date: date_list.append(current_date) current_date += day_delta date_df = pd.Series(date_list)
这个方案生成全量10000年的日期总共约365万条记录,普通消费级设备几秒就能跑完,内存占用在50MB以内,没有性能问题。
补充说明:公元1582年之前全球通用儒略历,现行公历(格里高利历)是1582年之后才逐步推行的,上述两种方法默认都是按格里高利历向前回推计算日期,如果需要严格匹配历史上的真实历法日期,需要额外做儒略历到格里高利历的转换。
内容的提问来源于stack exchange,提问作者Sri Charan
相关产品推荐
相关产品推荐

