如何将Python查询MySQL返回列表中的datetime对象转为YYYY-MM-DD HH:MM:SS格式
解决方法
方法一:在SQL查询阶段直接返回格式化日期
MySQL自带DATE_FORMAT函数,可以直接在查询时将datetime类型字段转为你需要的字符串格式,不需要后续在Python中额外处理,示例查询语句:
SELECT _id, name, DATE_FORMAT(_cdate, '%Y-%m-%d %H:%i:%s') AS _cdate, title FROM 你的表名;
用该语句查询返回的_cdate字段直接就是YYYY-MM-DD HH:MM:SS格式的字符串。
方法二:在Python层面对返回结果做格式转换
你遇到的迭代时报字典已变更的错误,通常是因为你在遍历字典的keys()/items()视图的同时修改了字典的结构(新增/删除键),或者在遍历列表的同时增删了列表元素,用下面两种方式都可以规避这个问题:
方式1:生成新的结果列表(最安全,不修改原数据)
import datetime # 替换为你实际查询得到的原始结果列表 origin_list = [{'_id': 1, 'name': 'index', '_cdate': datetime.datetime(2020, 10, 27, 9, 4, 34), 'title': 'DataExtract'}, {'_id': 2, 'name': 'topmenu', '_cdate': datetime.datetime(2020, 11, 4, 19, 52, 17), 'title': 'topmenu'}, {'_id': 3, 'name': 'functions_common', '_cdate': datetime.datetime(2020, 11, 4, 19, 52, 50), 'title': 'common functions'}, {'_id': 4, 'name': 'leftmenu', '_cdate': datetime.datetime(2020, 11, 4, 19, 53, 56), 'title': 'Left Menu'}, {'_id': 5, 'name': 'todo', '_cdate': datetime.datetime(2020, 11, 7, 8, 49, 38), 'title': 'Todo'}, {'_id': 6, 'name': 'cron_publish', '_cdate': datetime.datetime(2020, 12, 2, 19, 30, 11), 'title': 'Run Publish reports'}, {'_id': 7, 'name': 'test', '_cdate': datetime.datetime(2020, 12, 2, 22, 32, 54), 'title': 'test'}, {'_id': 8, 'name': 'help', '_cdate': datetime.datetime(2020, 12, 5, 7, 12, 44), 'title': 'Help'}, {'_id': 9, 'name': 'api', '_cdate': datetime.datetime(2020, 12, 5, 21, 22, 13), 'title': 'API'}, {'_id': 10, 'name': 'ben', '_cdate': datetime.datetime(2021, 10, 4, 11, 37, 3), 'title': 'List of Reports'}] formatted_list = [] for item in origin_list: # 复制原字典,避免修改原数据触发报错 new_item = item.copy() if isinstance(new_item['_cdate'], datetime.datetime): new_item['_cdate'] = new_item['_cdate'].strftime('%Y-%m-%d %H:%M:%S') formatted_list.append(new_item)
最终formatted_list就是格式转换完成的结果。
方式2:直接修改原列表内的字典值
如果不需要保留原结果,可以直接按索引遍历列表修改,仅修改字典已有键的值不会触发迭代报错:
import datetime # 替换为你实际查询得到的原始结果列表 origin_list = [{'_id': 1, 'name': 'index', '_cdate': datetime.datetime(2020, 10, 27, 9, 4, 34), 'title': 'DataExtract'}, {'_id': 2, 'name': 'topmenu', '_cdate': datetime.datetime(2020, 11, 4, 19, 52, 17), 'title': 'topmenu'}, {'_id': 3, 'name': 'functions_common', '_cdate': datetime.datetime(2020, 11, 4, 19, 52, 50), 'title': 'common functions'}, {'_id': 4, 'name': 'leftmenu', '_cdate': datetime.datetime(2020, 11, 4, 19, 53, 56), 'title': 'Left Menu'}, {'_id': 5, 'name': 'todo', '_cdate': datetime.datetime(2020, 11, 7, 8, 49, 38), 'title': 'Todo'}, {'_id': 6, 'name': 'cron_publish', '_cdate': datetime.datetime(2020, 12, 2, 19, 30, 11), 'title': 'Run Publish reports'}, {'_id': 7, 'name': 'test', '_cdate': datetime.datetime(2020, 12, 2, 22, 32, 54), 'title': 'test'}, {'_id': 8, 'name': 'help', '_cdate': datetime.datetime(2020, 12, 5, 7, 12, 44), 'title': 'Help'}, {'_id': 9, 'name': 'api', '_cdate': datetime.datetime(2020, 12, 5, 21, 22, 13), 'title': 'API'}, {'_id': 10, 'name': 'ben', '_cdate': datetime.datetime(2021, 10, 4, 11, 37, 3), 'title': 'List of Reports'}] for i in range(len(origin_list)): item = origin_list[i] if isinstance(item['_cdate'], datetime.datetime): # 仅修改已有键的值,不改变字典结构,不会报错 item['_cdate'] = item['_cdate'].strftime('%Y-%m-%d %H:%M:%S')
内容的提问来源于stack exchange,提问作者Steve Lloyd
相关产品推荐
相关产品推荐

