CSV列日期相减计算 筛选信用卡有效期超10年用户导出JSON报错修复
修复后的日期筛选导出Python代码
错误原因说明
- 直接对日期字符串后两位做减法:既无法处理字符串类型运算问题,也会遇到跨世纪年份计算错误(比如1999年和2002年的后两位相减得到负数)
- 出现
'datetime.datetime' object is not iterable报错:大概率是代码中错误遍历了单个datetime对象,或者把datetime对象当成可迭代对象做了解包操作
可运行完整代码
假设你的CSV中信用卡开卡日期字段名为ccard_issue_date,到期日字段名为ccard_expire_date,日期格式为年-月-日(如2018-03-15),如果字段名或格式不匹配直接替换代码中对应部分即可:
import csv import json import datetime # 存储符合筛选条件的客户数据 to_remove_list = [] # 替换为你的CSV文件路径 with open("customer_data.csv", "r", encoding="utf-8") as csv_f: # 如果你已经用csv.reader完成了结构化字典构建,直接复用你的逻辑即可 reader = csv.DictReader(csv_f) for row in reader: # 解析日期,格式不匹配的话修改第二个参数的格式串 try: issue_dt = datetime.datetime.strptime(row["ccard_issue_date"], "%Y-%m-%d") expire_dt = datetime.datetime.strptime(row["ccard_expire_date"], "%Y-%m-%d") # 日期格式非法的行可按业务需求调整处理逻辑 except ValueError: continue # 判断日期间隔是否超过10年,避开闰年误差 issue_after_10y = datetime.datetime( issue_dt.year + 10, issue_dt.month, issue_dt.day ) if expire_dt > issue_after_10y: # 这里写入你已经构建好的结构化字典即可 to_remove_list.append(row) # 导出为目标JSON文件 with open("remove_ccard.json", "w", encoding="utf-8") as json_f: json.dump(to_remove_list, json_f, ensure_ascii=False, indent=2)
注意事项
- 不需要安装第三方库的前提下,不要用
(expire_dt - issue_dt).days > 365 * 10的计算方式,会因为闰年导致误差 - 日期格式串需要和CSV内的实际格式完全匹配:比如格式为
月/日/年就替换为%m/%d/%Y,格式为年/月/日就替换为%Y/%m/%d
内容的提问来源于stack exchange,提问作者Derya
相关产品推荐
相关产品推荐

