【问题标题】:Sort list of datetime objects using different string format使用不同的字符串格式对日期时间对象列表进行排序
【发布时间】:2021-01-17 02:32:06
【问题描述】:

我正在使用 Datetime 生成一个随机日期列表,并且需要显示为 dd/mm/yy(例如 20 年 3 月 24 日是 2020 年 3 月 24 日)。我可以使用 strftime 对其进行排序,但是它会在从左到右时破坏排序,因此需要一天时间并按该顺序排序。

获取一个日期时间对象,转换成一个字符串进行格式化,然后将该字符串转换回一个日期时间对象进行排序,这似乎有点过头了。

如何正确排序此列表的日期?

提前感谢您!

import random
from datetime import datetime, timedelta

user_test_date = datetime.strptime("12/12/21", '%d/%m/%y')
ledger = []

''' Create date for transaction '''
def date_gen():
    date_step = random.randrange(1, 60) # Set range of 2 months
    raw_date = user_test_date + timedelta(days =- date_step) # Alter days value each loop 
    date = raw_date.strftime('%w %b %y') #Change format of date
    
    ledger.append(date)
    ledger.sort(key=lambda item: item[0], reverse=True) #Sort list of dates

for i in range(10):
    date_gen()

print(ledger)

【问题讨论】:

  • 每次添加日期时,您都在对账本进行排序;相反,您可以添加所有日期,然后对分类帐进行一次排序。推动这个想法;将所有日期作为datetime 对象添加到临时分类帐;对临时账本进行排序;然后ledger = [raw_date.strftime('%w %b %y') for raw_date in temporary_ledger]
  • 改进这个想法;你可以创建一个类Ledger,它维护一个排序好的datetime对象集合,并使用一个返回字符串列表的方法Ledger.view()
  • 为什么不将raw_date 保留在列表中并仅将strftime 用于打印?
  • 谢谢@Stef。我还没有尝试过这种方法,所以感谢提及。我可以很好地对日期时间对象进行排序,但是当我应用日期格式更改时,日期排序再次变得不正确。 ``` ['21 年 12 月 2 日','21 年 11 月 0 日','21 年 11 月 5 日','21 年 11 月 4 日','21 年 11 月 1 日','21 年 10 月 5 日','21 年 10 月 5 日','21 年 10 月 4 日', '0 Oct 21', '4 Oct 21'] ``` 这是输出的一个例子。也有 0 个值,但会到达该层
  • @Swain:如果我们忽略带有 0 的日期,那么您的列表似乎以相反的顺序排序。试试.sort(reverse=True).sort(reverse=False)。您可能还会发现这个答案很有趣:Generate a random date between two other dates

标签: python sorting datetime strftime


【解决方案1】:

这里:

date = raw_date.strftime('%w %b %y') #Change format of date

您将日期时间对象转换为 str。尝试跳过此行并将date_gen 中的最后一行替换为ledger.sort()

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 1970-01-01
    • 2018-05-29
    • 2016-04-04
    • 2016-08-18
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多