如何检查并更新字典中指定键的日期格式?求技术帮助
问题分析与修复方案
原始数据与需求
输入数据
response = [{'startdata': 'Aug 24, 2022 10:37:50 PM', 'enddata': 'Aug 24, 2022 10:37:50 PM', 'province': 'Mashonaland_Central', 'district': 'Guruve', 'on_consent': '', 'meta': ''}] data_mod = ["startdata", "enddata"]
需求
遍历data_mod中的字段,若该字段存在于response的字典中,则将其日期格式从%b %d, %Y %I:%M:%S %p转换为%Y-%m-%dT%H:%M:%S+00:00;若字段不存在则直接忽略。
原代码的问题
- 字段名不匹配:数据中实际字段是
startdata/enddata,但代码硬编码了starttime/endtime,还处理了不存在的CompletionDate/SubmissionDate,直接触发KeyError。 - 未按
data_mod动态处理:没有遍历data_mod列表,而是固定写死字段,完全不符合需求逻辑。 - 异常处理无效:直接
raise e等于未处理异常,且没有针对性捕获日期解析或字段不存在的异常。 - 生成器逻辑矛盾:函数同时使用
yield和return data,yield会让函数变成生成器,后续的return语句不会执行,逻辑混乱。
修复后的代码
from datetime import datetime def process_response(response, data_mod): dateformat_in = "%b %d, %Y %I:%M:%S %p" dateformat_out = "%Y-%m-%dT%H:%M:%S+00:00" for data in response: # 遍历data_mod中的字段,动态处理 for field in data_mod: if field in data: try: # 解析并转换日期格式 parsed_date = datetime.strptime(data[field], dateformat_in) data[field] = parsed_date.strftime(dateformat_out) except ValueError as e: # 捕获日期格式解析错误,可根据需求选择跳过或记录日志 print(f"解析字段 {field} 的日期失败: {e}") # 返回处理后的字典 yield data # 调用示例 response = [{'startdata': 'Aug 24, 2022 10:37:50 PM', 'enddata': 'Aug 24, 2022 10:37:50 PM', 'province': 'Mashonaland_Central', 'district': 'Guruve', 'on_consent': '', 'meta': ''}] data_mod = ["startdata", "enddata"] processed_data = list(process_response(response, data_mod)) print(processed_data)
代码说明
- 动态字段处理:通过遍历
data_mod列表,检查每个字段是否存在于字典中,完全贴合需求逻辑。 - 针对性异常捕获:只捕获
ValueError(日期格式解析错误),避免掩盖其他类型的错误,同时可根据实际需求添加日志记录或跳过错误字段。 - 生成器逻辑正确:使用
yield逐个返回处理后的字典,保持生成器的特性;若需要一次性返回所有结果,也可改为收集到列表后返回。 - 字段名匹配:使用数据中实际存在的
startdata/enddata字段,彻底避免KeyError。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

