在列表中查找今天最近的日期

时间:2017-08-07 15:40:36

标签: python python-3.x list datetime lambda

我的目标是从列表中获取下一个最近的日期(将来,而不是过去)到今天的日期。为简单起见,列表(例如2017-01-31; YYYY-MM-DD)的格式是本赛季的每个足球比赛,我正在尝试创建一个部分找到“下一个”足球比赛的脚本。

我在互联网和Stack Overflow上搜索了答案并找到了promising post,但是所提供的解决方案使用了不同的格式,当我尝试将其定制为我的时候,它会触发异常。

我的逻辑包括解析RSS提要,所以我只是提供原始列表。考虑到这一点,我的简化代码如下:

today = str(datetime.date.today())
print(today)

scheduledatelist = ['2017-09-01', '2017-09-09', '2017-09-16', '2017-09-23', '2017-09-30', '2017-10-07', '2017-10-14', '2017-10-21', '2017-10-27', '2017-11-11', '2017-11-18', '2017-11-25']
scheduledatelist = list(reversed(scheduledatelist)) #purpose: to have earliest dates first

这是我尝试调整之前帖子的解决方案(我不熟悉函数式编程,所以我可能没有正确地适应它):

get_datetime = lambda s: datetime.datetime.strptime(s, "%Y-%m-%d")
base = get_datetime(today)
later = filter(lambda d: today(d[0]) > today, scheduledatelist)
closest_date = min(later, key = lambda d: today(d[0]))
print(closest_date)

无论我的尝试(在我的情况下可能不是最好的,因为它改变了格式,我需要结束值仍然是YYYY-MM-DD),有没有更简单的方法来做到这一点?我需要下一个游戏(最接近今天)值,因为它将继续用于我的逻辑。那么回顾一下,从今天开始,如何在列表中找到最接近未来的日期。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

首先,让我们使用datetime.datetime.strptimedatetime.datetime.date方法从字符串创建datetime.date个对象,因为datetime.date个对象是有序的,更容易使用:

date_format = '%Y-%m-%d'
dates = [datetime.datetime.strptime(date_string,
                                    date_format).date()

然后让我们过滤掉将来(今天之后)发生的日期

today = datetime.date.today()
future_dates = [date
                for date in dates
                if date >= today]

然后我们可以使用min

简单地找到下一个最近的日期
next_closest_date = min(future_dates)

给了我们

>>>next_closest_date
2017-09-01

给出示例

警告

如果今天之后没有日期,则会导致错误,如

ValueError: min() arg is an empty sequence

如果可以,那么我们可以离开它,但如果我们不想得到错误 - 我们可以指定min的默认值,如果是空序列,如

next_closest_date = min(future_dates, default=None)

最后我们可以写一个函数如下

import datetime


# `default` value is returned when there is no future date strings found
def get_next_closest_date(date_strings, date_format, default=None):
    today = datetime.date.today()
    dates = [datetime.datetime.strptime(date_string,
                                        date_format).date()
             for date_string in date_strings]
    future_dates = [date
                    for date in dates
                    if date >= today]
    return min(future_dates, default)

并像

一样使用它
scheduledatelist = ['2017-09-01', '2017-09-09', '2017-09-16', '2017-09-23',
                    '2017-09-30', '2017-10-07', '2017-10-14', '2017-10-21',
                    '2017-10-27', '2017-11-11', '2017-11-18', '2017-11-25']
next_closest_date = get_next_closest_date(date_strings=scheduledatelist,
                                          date_format='%Y-%m-%d')
print(next_closest_date)

答案 1 :(得分:1)

你可以这样做:

min(scheduledatelist, key=lambda s: 
                  datetime.datetime.strptime(s, "%Y-%m-%d").date()-datetime.date.today())

距离今天最近的一个日期。

您可以使用相同的功能按距离排序:

sorted(scheduledatelist, key=lambda s: 
              datetime.datetime.strptime(s, "%Y-%m-%d").date()-datetime.date.today())

返回的列表将在距离今天的几天内增加。如果日期在今天之前或之后,则有效。

如果您希望将来只有日期,请过滤掉过去的日期。由于日期字符串为ISO 8601格式,因此您可以进行词汇词比较:

min([d for d in scheduledatelist if d>str(datetime.date.today())], key=lambda s: 
              datetime.datetime.strptime(s, "%Y-%m-%d").date()-datetime.date.today())