我希望将日期列表与今天的日期进行比较,并希望返回最接近的日期。香港专业教育学院有各种各样的想法,但它们似乎非常令人费解,并且涉及根据差异天数和最小差异来计分。但是我不知道如何做到这一点,任何指针都将不胜感激。
while_loop
在等待编辑时
所以我用下面的方法解决了这个问题
tf.nn.dynamic_rnn
答案 0 :(得分:2)
将每个字符串转换为datetime.date对象,然后减去并获得最小的差异
import datetime
import re
date_list = ['2019-02-10', '2018-01-13', '2019-02-8',]
now = datetime.date.today()
date_list_converted = [datetime.datetime.strptime(each_date, "%Y-%m-%d").date() for each_date in date_list]
differences = [abs(now - each_date) for each_date in date_list_converted]
minimum = min(differences)
closest_date = date_list[differences.index(minimum)]
答案 1 :(得分:1)
Python的内置datetime模块具有执行所需功能的功能。
首先让您获取日期列表,然后将其转换为日期时间对象列表:
from datetime import datetime
date_list = ['2019-02-10', '2018-01-13', '2019-02-8']
datetime_list = [datetime.strptime(date, "%Y-%m-%d") for date in date_list]
有了这个,我们就可以找到这些日期和今天的日期之间的差异。
today = datetime.today()
date_diffs = [abs(date - today) for date in datetime_list]
非常好,date_diffs
现在是datetime.timedelta
对象的列表。剩下的就是找到最小值并找到它代表的日期。
要找到最小差异,使用min(date_diffs)
很简单,但是,我们然后要使用此最小值来提取相应的最接近日期。可以通过以下方式实现:
closest_date = date_list[date_diffs.index(min(date_diffs))]
如果性能是一个问题,那么可能值得研究一下熊猫的实现。使用熊猫,我们可以将您的日期转换为熊猫数据框:
from datetime import datetime
import pandas as pd
date_list = ['2019-02-10', '2018-01-13', '2019-02-8']
date_df = pd.to_datetime(date_list)
最后,就像在使用内置方法的方法中一样,我们发现日期之间的差异,并用它来提取与今天最接近的日期。
today = datetime.today()
date_diffs = abs(today - date_df)
closest_date = date_list[date_diffs.argmin()]
此方法的优点是我们删除了for循环,因此我希望该方法对于大量日期更有效
答案 2 :(得分:0)
这会将字符串转换为datetime对象,然后从该对象中减去当前日期,并返回具有相应的最低绝对差的日期:
import datetime
import re
date_list = ['2019-02-10', '2018-01-13', '2019-02-8',]
numPattern = re.compile("[0-9]+")
def getclosest(dates):
global numPattern
now = datetime.date.today()
diffs = []
for day in date_list:
year, month, day = [int(i) for i in re.findall(numPattern, day)]
currcheck = datetime.date(year, month, day)
diffs.append(abs(now - currcheck))
return dates[diffs.index(min(diffs))]
这绝不是最有效的,但它是半优雅的并且可以工作。
答案 3 :(得分:0)
一种快速而简单的方法是使用bisect算法,尤其是在您的date_list很大的情况下:
import datetime
from bisect import bisect_left
FMT = '%Y-%m-%d'
date_list = ['2019-02-10', '2018-01-13', '2019-02-8', '2019-02-12']
date_list.sort()
def closest_day_to_now(days):
"""
Return the closest day form an ordered list of days
"""
now = datetime.datetime.now()
left_closest_day_index = bisect_left(days, now.strftime(FMT))
# check if there is one greater value
if len(days) - 1 > left_closest_day_index:
right_closest_day_index = left_closest_day_index + 1
right_day = datetime.datetime.strptime(days[right_closest_day_index], FMT)
left_day = datetime.datetime.strptime(days[left_closest_day_index], FMT)
closest_day_index = right_closest_day_index if abs(right_day - now) < abs(left_day - now) \
else left_closest_day_index
else:
closest_day_index = left_closest_day_index
return days[closest_day_index]
print(closest_day_to_now(date_list))