比较日期并找到最接近当前日期的日期

时间:2019-02-11 13:52:55

标签: python python-3.x

我希望将日期列表与今天的日期进行比较,并希望返回最接近的日期。香港专业教育学院有各种各样的想法,但它们似乎非常令人费解,并且涉及根据差异天数和最小差异来计分。但是我不知道如何做到这一点,任何指针都将不胜感激。

while_loop

在等待编辑时

所以我用下面的方法解决了这个问题

tf.nn.dynamic_rnn

4 个答案:

答案 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))