如何在PrettyTable中存储datetime对象实现按日期而非字符串排序
解决方案
你遇到的排序异常是因为Month列存储的是字符串类型,PrettyTable默认按字符串字典序排序,想要按自然月份逻辑排序,存储datetime对象即可实现,另外也可以通过自定义排序键快速实现需求,两种方案如下:
方案1:存储datetime对象实现排序(推荐)
该方案底层存储标准日期对象,排序逻辑天然正确,后续扩展日期相关处理也更灵活,完整代码示例:
from prettytable import PrettyTable import datetime # 初始化表格 table = PrettyTable(["Name","Month", "Grade"]) table.title = "title test" # 添加行时,Month列存储对应月份的date对象(年份任选,不影响月份排序逻辑) table.add_row(["Joe", datetime.date(2024, 1, 1), 90]) table.add_row(["Sally", datetime.date(2024, 2, 1), 100]) table.add_row(["Bill", datetime.date(2024, 3, 1), 90]) table.add_row(["Alice", datetime.date(2024, 4, 1), 90]) # 自定义Month列的显示格式,将date对象转换为需要的月份名称展示 # %B表示输出完整月份名(如April),%b表示输出缩写(如Apr),可按需调整 table.custom_format["Month"] = lambda field, value: value.strftime("%B") # 直接按Month列排序即可,自动按日期逻辑排序 print(table.get_string(sortby="Month"))
运行后输出的Month列会按Jan→Feb→Mar→April的自然顺序排列。
方案2:自定义排序键(无需修改原有数据)
如果不想改动原有存储的月份字符串,可以通过sort_key参数自定义排序规则,改动量极小:
from prettytable import PrettyTable # 原有代码完全不变,还是存储月份字符串 table = PrettyTable(["Name","Month", "Grade"]) table.title="title test" table.add_row(["Joe","Jan", 90]) table.add_row(["Sally", "Feb", 100]) table.add_row(["Bill", "Mar", 90]) table.add_row(["Alice", "April", 90]) # 定义月份名称到数字的映射,用于排序 month_order_map = { "Jan": 1, "Feb": 2, "Mar": 3, "April": 4, "May": 5, "Jun": 6, "Jul": 7, "Aug": 8, "Sep": 9, "Oct": 10, "Nov": 11, "Dec": 12 } # 排序时指定sort_key,按映射的月份数字排序 print(table.get_string( sortby="Month", sort_key=lambda row: month_order_map[row[1]] ))
内容的提问来源于stack exchange,提问作者Slartibartfast
相关产品推荐
相关产品推荐

