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

仅用Python标准库计算嵌套JSON中mm/yyyy格式日期差值问题求助

问题修复方案

现有代码的核心问题

  • 循环变量使用错误:遍历data_json时定义的循环变量是line,但函数传参和列表追加用的是未对应上的data_file,导致判断逻辑完全未按预期执行
  • 日期差值计算顺序颠倒:你需要计算end_date - start_date的间隔,现有代码是用start_date减end_date,如果结束日期晚于开始日期,得到的年/月差值为负数,永远无法触发>=10年的判断条件
  • 间隔判断逻辑错误:elif card_year == 10 and card_year > 0的条件完全冗余,此处应该判断月份差值是否为正,确认满10年整

修复后的可运行代码

方案1:用标准库datetime实现(更稳妥,避免手动计算出错)

import json
from datetime import datetime

remove_card = []

def is_over_10_years(data_entry):
    start_str = data_entry['Credit Card']['start_date']
    end_str = data_entry['Credit Card']['end_date']
    # 直接按mm/yyyy格式解析日期,自动处理格式合法性校验
    start_date = datetime.strptime(start_str, "%m/%Y")
    end_date = datetime.strptime(end_str, "%m/%Y")
    year_diff = end_date.year - start_date.year
    month_diff = end_date.month - start_date.month
    # 间隔超过10年的判断:年差大于10,或年差等于10且月份足够凑满整10年
    return year_diff > 10 or (year_diff == 10 and month_diff >= 0)

# 你的JSON加载逻辑保留即可,示例:
# with open("你的文件路径.json", "r", encoding="utf-8") as f:
#     data_json = json.load(f)

for entry in data_json:
    if is_over_10_years(entry):
        remove_card.append(entry)

方案2:纯字符串拆分实现(符合你最初的实现思路)

remove_card = []

def is_over_10_years(data_entry):
    start_str = data_entry['Credit Card']['start_date']
    end_str = data_entry['Credit Card']['end_date']
    start_month, start_year = map(int, start_str.split('/'))
    end_month, end_year = map(int, end_str.split('/'))
    year_diff = end_year - start_year
    month_diff = end_month - start_month
    return year_diff > 10 or (year_diff == 10 and month_diff >= 0)

for entry in data_json:
    if is_over_10_years(entry):
        remove_card.append(entry)

优化建议

  • 变量名尽量语义化,避免使用expr1、data_file这类容易混淆的命名,降低写错变量的概率
  • 日期计算优先使用Python标准库datetime模块的解析能力,不需要自己处理日期逻辑,避免出现特殊格式、月份边界等场景的计算错误
  • 不需要显式写== True的判断,直接用函数返回的布尔值做判断即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:24:03