You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用for循环生成Pandas Timestamp时触发ValueError问题求助

解决Pandas Timestamp生成时的"day is out of range for month"错误

问题根源

报错的核心原因不是循环类型差异,而是for循环中range()生成的起始值为0,而Pandas的Timestamp不接受day=0的参数(不存在"0号"日期),直接触发日期合法性校验错误。你写的while循环从day=1开始,所有日期均为合法值,因此能正常运行。

逐段代码分析

  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。

  1. 第二段列表推导式代码:
[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无效日期,触发报错。

  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 18:11:09