Python查询MySQL去重日期列表:结果重复且格式不符合预期
优化方案:分场景实现目标格式的去重日期列表
方案1:优先推荐——数据库层完成去重+格式化,效率最高
你之前的写法需要拉取全表数千条重复记录回Python端处理,完全可以把去重、格式化的逻辑下推到MySQL层执行,仅返回最终需要的结果,大幅降低传输和计算开销。
对应调整后的查询逻辑:
mycursor.execute(""" SELECT DISTINCT DATE_FORMAT(date, '%Y/%m/%d') FROM db_cryptoprice -- 如需按日期正序排列,可追加排序规则 ORDER BY 1 """) # 将返回的单元素元组拆解为纯字符串列表 date_list = [row[0] for row in mycursor.fetchall()] print(date_list)
返回结果直接符合预期格式:
['2021/04/18', '2021/04/19', '2021/04/20', '2021/04/21']
说明:
DATE_FORMAT(date, '%Y/%m/%d')会自动将月份、日期补零为两位,输出斜杠分隔的标准格式,和需求完全匹配。
方案2:基于已拉取的全量date数据做Python端处理
如果你已经完成了全量数据拉取,拿到了形如[(datetime.date(2021, 4, 18),), (datetime.date(2021, 4, 19),)...]的原始结果,只需要两步就能处理成目标格式:
- 拆解元组、对date对象去重
- 将date对象格式化为要求的字符串格式
对应代码:
# 原始查询得到的test变量为fetchall返回的元组列表 mycursor.execute("SELECT DATE(date) FROM db_cryptoprice") test = mycursor.fetchall() # 1. 提取元组内的date对象并去重,无需保序可直接用集合提升效率 # 如需保留日期首次出现的顺序,替换为dict.fromkeys的写法 unique_date_objs = {row[0] for row in test} # 2. 格式化date对象为 年/月/日 的两位补零格式 date_list = [d.strftime('%Y/%m/%d') for d in unique_date_objs]
之前代码的问题说明
你之前使用list(dict.fromkeys(test))时,是把整个单元素元组作为去重的键,没有提取元组内部的date对象,所以得到的列表元素依然是带逗号的元组结构,无法直接得到格式化字符串。
内容的提问来源于stack exchange,提问作者A. Prats
相关产品推荐
相关产品推荐

