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

如何解决含无效日期时的ValueError: day is out of range for month错误

解决无效日期导致的Matplotlib ValueError问题

嘿,看来你卡在无效日期(比如6月31日)导致的绘图报错上了!别担心,我来帮你彻底解决这个问题——核心原因大概率是你的validateDates函数只做了字符串格式检查,没真正验证日期的逻辑有效性(比如6月根本没有31天),所以无效日期还是留在列表里,导致strptime解析时抛出错误。

下面给你一套可行的解决方案:

1. 编写真正有效的日期验证&清理函数

我们需要用datetime.strptime尝试解析每个日期,通过捕获ValueError来准确识别无效日期,同时还要同步清理对应的销售数据(避免数据错位):

from datetime import datetime
import matplotlib.pyplot as plt

def validate_and_clean_dates(date_list, sales_data_list, date_format="%d/%m/%Y"):
    valid_dates = []
    valid_sales = []
    for date_str, sales in zip(date_list, sales_data_list):
        try:
            # 尝试解析日期,确认逻辑上有效
            parsed_date = datetime.strptime(date_str, date_format)
            valid_dates.append(parsed_date)
            valid_sales.append(sales)
        except ValueError:
            # 可选:打印无效日期提示,方便排查
            print(f"已跳过无效日期: {date_str}")
    return valid_dates, valid_sales

2. 用清理后的数据绘图

调用上面的函数处理你的原始数据,再用matplotlib绘图:

# 替换成你的原始日期和销售数据列表
raw_dates = ["31/06/2016", "01/07/2016", "30/06/2016", "31/04/2016"]
raw_sales = [120, 180, 150, 90]

# 清理无效数据
clean_dates, clean_sales = validate_and_clean_dates(raw_dates, raw_sales)

# 绘制图表
plt.figure(figsize=(10, 6))
plt.plot(clean_dates, clean_sales, marker='o', linestyle='-', color='b')
plt.xlabel("日期", fontsize=12)
plt.ylabel("销售额", fontsize=12)
plt.title("销售额趋势图", fontsize=14)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

3. 关键细节说明

  • 同步清理数据:用zip同时遍历日期和销售数据,确保过滤无效日期时,对应的销售数据也被同步移除,避免出现日期和销售额不匹配的问题。
  • 真正的有效性验证:strptime会严格检查日期的逻辑合理性(比如6月最多30天),而不是只检查字符串格式,这才是解决报错的核心。
  • 使用datetime对象绘图:解析后的datetime类型会被matplotlib自动识别,坐标轴的日期格式化会更准确省心。

如果你的原validateDates函数是只做了字符串格式检查(比如判断是否有两个斜杠、数字长度是否正确),那肯定会漏掉像6月31日这种格式正确但逻辑无效的日期,上面的方法就能完美解决这个问题啦!

内容的提问来源于stack exchange,提问作者Naji Krayem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:57:06