使用for循环生成Pandas Timestamp时触发ValueError问题求助
解决Pandas Timestamp生成时的"day is out of range for month"错误
问题根源
报错的核心原因不是循环类型差异,而是for循环中range()生成的起始值为0,而Pandas的Timestamp不接受day=0的参数(不存在"0号"日期),直接触发日期合法性校验错误。你写的while循环从day=1开始,所有日期均为合法值,因此能正常运行。
逐段代码分析
- 第一段for循环代码:
idx = list() for day in range(10): idx.append(pd.Timestamp(year = 1997, month = 1, day = day, hour = 12)) pd.Series(list(ascii_uppercase), index = idx)
range(10)生成0,1,2,...,9,当day=0时,尝试创建1997-01-00这一无效日期,直接抛出ValueError。
- 第二段列表推导式代码:
[pd.Timestamp(year = 1997, month = 5, day = i, hour = 14, minute = i + 24, microsecond = i + 49) for i in range(27)]
range(27)生成0,1,2,...,26,i=0时day=0,尝试创建1997-05-00无效日期,触发报错。
- while循环代码:
day = 1 dates = list() while (day < 31): print(pd.Timestamp(year = 2018, month = 6, day = day, hour = 13, minute = 10 + day, second = 26 + day)) dates.append(pd.Timestamp(year = 2018, month = 6, day = day, hour = 13, minute = 10 + day, second = 26 + day)) day += 1
day从1开始,到30结束(day<31),6月有30天,所有day值都是1-30的合法日期,因此运行正常。
修正方案
只需将for循环的range()起始值改为1,确保day参数从合法的1号开始:
- 修正第一段代码:
idx = list() # range(1,10)生成1-9的整数 for day in range(1, 10): idx.append(pd.Timestamp(year=1997, month=1, day=day, hour=12)) pd.Series(list(ascii_uppercase), index=idx)
- 修正第二段列表推导式:
# range(1,27)生成1-26的整数 [pd.Timestamp(year=1997, month=5, day=i, hour=14, minute=i+24, microsecond=i+49) for i in range(1, 27)]
补充说明
Pandas的Timestamp会严格校验日期合法性:
day参数必须是对应月份的有效日期(1到当月最大天数)- 传入0或超过当月天数的数值,都会触发
ValueError: day is out of range for month
内容的提问来源于stack exchange,提问作者user17061353
相关产品推荐
相关产品推荐

