仅用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
相关产品推荐
相关产品推荐

