Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从日期时间列表中创建人性化的字符串_Python_Datetime_Formatting - Fatal编程技术网

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

Python:从日期时间列表中创建人性化的字符串,python,datetime,formatting,Python,Datetime,Formatting,我实际上在寻找这个问题的反面: 我有一个datetime对象列表,我想创建一个人性化的字符串 例如,“2012年2月4日1月27日和30日”。有什么想法吗 请注意,strftime仅适用于单个datetime对象。这里的问题是,您有一个日期时间列表,它的间隔可能不均匀,可能跨越月份或年份边界,但整个日期范围必须用一个简洁的字符串表示 更新:您需要列表理解才能在一行中完成 date_strings = [dt.strftime("%A %d. %B %Y") for dt in your_da

我实际上在寻找这个问题的反面:

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

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

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

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
导入日期时间
#样本输入
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_连续_范围(日期):
日期=已排序(日期)
delta_1day=datetime.timedelta(天=1)
范围=[]
最后日期=日期[0]
tmp_范围=[最后一次,无]
对于d in日期[1:]:

如果d-last\d您看过对单个datetime对象有效的
strftime
方法吗。我需要获取datetime对象列表并创建单个字符串,例如:[(2012,05,23),(2012,05,30),(2012,06,06)]变为“Weds”。2012年5月23日至6月6日“正如您所指出的,转换单个datetime对象很容易。转换一系列跨越月份甚至年份边界的datetime对象需要更优雅的方式。在我花时间/$$$写这篇文章之前,我想看看是否有其他人找到了解决方案会很有帮助。所以你需要得到日期范围?比如“从2011年1月27日到2013年7月22日”?这个网站是
StackOverflow.com
,而不是
WriteMyCodeForMe.com
。因为我读了文档,你回答了错误的问题。我更新了我的答案。对不起,你应该把你的问题说得更清楚…:)如果你喜欢,可以随时编辑。谢谢。我已经修改了这个问题,但问题是要使单个字符串简洁。这不仅仅是一个连接转换后的单个日期列表的问题。这种情况是在一个只允许有限空间的网站上进行一系列广播。因此,虽然很容易得到名单,比如说,[(2012,11,28),(2012,12,5),(2012,12,12),(2012,12,19)],但将其改为“2012年11月28日,12月5-19日”并不简单(一个月后,如果你有2012年和2013年,情况会更糟,等等。“如果预算有时间的话,我可以自己写出来。我更新了代码,但我认为你需要更复杂的东西:)我不认为你能在任何地方找到你想要的(如此定制的)已经完成并准备好的东西。。。无论如何,希望它能帮助我。我想我需要一些更健壮的东西,但是你的代码在给我一些想法方面非常有用。谢谢是的,这适用于单个datetime对象。问题是,需要将一系列日期(可能间隔均匀,也可能间隔不均匀,可能跨越月份边界,可能跨越年份边界等)封装到单个字符串中。因此,strftime没有任何帮助。如果我没有更清楚地表达这个问题,很抱歉。
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
>>> dt=datetime.date(2012,2,4)
>>> dt.strftime('%A %B %d, %Y')
'Saturday February 04, 2012'