Python:从日期时间列表中创建人性化的字符串

时间:2012-05-15 21:26:29

标签: python datetime formatting

我实际上正在寻找这个问题的反面: Converting string into datetime

我有一个datetime对象列表,我想创建一个人性化的字符串 例如,“2012年1月27日和30日,2012年2月4日”。有什么想法吗?

请注意,strftime仅适用于单个日期时间对象。这里的问题是你有一个可能不是均匀间隔的日期时间列表,可能跨越月份或年份边界,但是整个日期范围必须用单个简洁的字符串表示。

2 个答案:

答案 0 :(得分:6)

This

your_date.isoformat() # -> '2002-03-11'
your_date.strftime("%A %d. %B %Y") # -> Monday 11. March 2002

更新:您需要列表理解才能在一行中完成。

date_strings = [dt.strftime("%A %d. %B %Y") for dt in your_date_list]

或者,使用for循环:

date_strings = []
for dt in your_date_list:
    date_str.append(dt.strftime("%A %d. %B %Y"))

更新2 :我相信这更接近您的期望,但仍然是您想要的,只有您知道它:您何时想要展示年份,何时不展示?何时只显示月份或日期等...但这基本上是一个想法。你可能会做某种类来代表范围,在那里你可以选择那里的格式,比较范围之间的月份和年份,......这就是我现在提出的。希望它有所帮助:

import datetime

# sample input
dates = [datetime.date(2012, 5, 21), datetime.date(2012, 5, 23),
        datetime.date(2012, 5, 25), datetime.date(2012, 5, 19),
        datetime.date(2012, 5, 17), datetime.date(2012, 5, 26),
        datetime.date(2012, 5, 18), datetime.date(2012, 5, 20)]

def get_consecutive_ranges(dates):
    dates = sorted(dates)

    delta_1day = datetime.timedelta(days=1)
    ranges = []
    last_d = dates[0]
    tmp_range = [last_d, None]
    for d in dates[1:]:
        if d-last_d <= delta_1day:
            # the difference between the dates is less than a day
            # we can extend the range, update the right-most boundary
            tmp_range[1] = d
        else:
            ranges.append(tmp_range)
            tmp_range = [d, None]
        last_d = d
    else:
        ranges.append(tmp_range)
    return ranges

ranges = get_consecutive_ranges(dates)

fmt = "%d %b %Y"

output = ", ".join([("%s" % (r[0].strftime(fmt),)) if r[1] is None else \
            ("%s-%s" % (r[0].strftime(fmt), r[1].strftime(fmt))) \
            for r in ranges])

print output

答案 1 :(得分:1)

>>> dt=datetime.date(2012,2,4)
>>> dt.strftime('%A %B %d, %Y')
'Saturday February 04, 2012'