在列表中查找离今天最近的日期
Find the closest date from today in a list
我的 objective 是从列表中获取下一个最接近今天的日期(在未来,而不是过去)。为简单起见,列表(格式为 2017-01-31
;YYYY-MM-DD
)是本赛季的每场足球比赛,我正在尝试创建一个脚本,部分找到 "next" 足球游戏。
我在互联网和 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
这是我尝试改编之前post的解决方案(我对函数式编程不是很精通,所以我可能改编不对):
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
),有没有更简单的方法来做到这一点?我需要下一场比赛(最接近今天)的价值,因为它将继续在我的逻辑中使用。所以回顾一下,我如何才能在我的列表中找到最近的日期,展望未来,从今天开始。感谢您的帮助!
首先让我们使用 datetime.datetime.strptime
and datetime.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)
你可以这样做:
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())
我的 objective 是从列表中获取下一个最接近今天的日期(在未来,而不是过去)。为简单起见,列表(格式为 2017-01-31
;YYYY-MM-DD
)是本赛季的每场足球比赛,我正在尝试创建一个脚本,部分找到 "next" 足球游戏。
我在互联网和 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
这是我尝试改编之前post的解决方案(我对函数式编程不是很精通,所以我可能改编不对):
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
),有没有更简单的方法来做到这一点?我需要下一场比赛(最接近今天)的价值,因为它将继续在我的逻辑中使用。所以回顾一下,我如何才能在我的列表中找到最近的日期,展望未来,从今天开始。感谢您的帮助!
首先让我们使用 datetime.datetime.strptime
and datetime.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)
你可以这样做:
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())