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

对CSV每行应用自定义日期计算函数时出现ValueError报错的求助

问题解答

报错触发原因

原来的getTotal函数使用split(', ')(逗号加空格)分割日期字符串,但你的CSV文件中日期分隔符是纯逗号,没有空格。这就导致整行内容被当作单个日期字符串传入datetime.strptime,匹配完第一个日期格式后剩余的内容无法被解析,直接抛出unconverted data remains错误。同时原函数没有处理每行末尾的换行符、单个日期前后的空白字符,也会额外增加解析失败概率。

调整后的代码是否解决根本问题

仅解决了日期分割的核心问题,但仍存在多处错误:

  • 代码中print(getTotal(dates))一行的dates变量没有提前定义,运行会直接抛出NameError
  • 没有校验每行日期数量是否为偶数,当某行日期总数为奇数时,循环中dates[i+1]会抛出索引越界错误
  • 没有处理空行、无效日期格式的异常场景,只要某行数据不符合规则就会直接中断运行

更优实现方案

from datetime import datetime
import csv

def getTotal(date_list):
    total = 0
    # 按每两个为一组遍历日期
    for i in range(0, len(date_list), 2):
        delta = date_list[i+1] - date_list[i]
        total += 2 if delta.days > 90 else 1
    return total

if __name__ == "__main__":
    with open('dataset.csv', 'r', encoding='utf-8', newline='') as csvfile:
        reader = csv.reader(csvfile)
        for row_num, row in enumerate(reader, 1):
            # 跳过空行
            if not row:
                continue
            try:
                # 转换日期,自动过滤空元素
                dates = []
                for elem in row:
                    elem = elem.strip()
                    if elem:
                        dates.append(datetime.strptime(elem, '%Y-%m-%d'))
                # 校验日期数量为偶数
                if len(dates) % 2 != 0:
                    print(f"第{row_num}行日期数量为奇数,跳过处理")
                    continue
                res = getTotal(dates)
                print(f"第{row_num}行计算结果:{res}")
            except ValueError as e:
                print(f"第{row_num}行日期格式错误:{e}")

优化点说明:

  • 使用Python标准库csv模块读取CSV文件,自动处理分隔符、换行符等格式问题,避免手动分割字符串的漏洞
  • 增加了空行跳过、日期格式异常捕获、日期数量校验等容错逻辑,不会因为单条数据异常中断整体运行
  • 增加了行号提示,方便定位错误数据

内容的提问来源于stack exchange,提问作者Chadi N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:45:00