Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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_Python 3.x - Fatal编程技术网

Python 比较日期并查找与当前日期最近的日期

Python 比较日期并查找与当前日期最近的日期,python,python-3.x,Python,Python 3.x,我想将日期列表与今天的日期进行比较,并希望返回最接近的日期。我对此有各种各样的想法,但它们似乎非常复杂,涉及到根据多少天的差异得分和采取最小的差异。但我不知道如何做到这一点,任何指针都会被欣赏 import datetime import re date_list = ['2019-02-10', '2018-01-13', '2019-02-8',] now = datetime.date.today() for date_ in date_list: match = re.mat

我想将日期列表与今天的日期进行比较,并希望返回最接近的日期。我对此有各种各样的想法,但它们似乎非常复杂,涉及到根据多少天的差异得分和采取最小的差异。但我不知道如何做到这一点,任何指针都会被欣赏

import datetime
import re

date_list = ['2019-02-10', '2018-01-13', '2019-02-8',]
now = datetime.date.today()

for date_ in date_list:
    match = re.match('.*(\d{4})-(\d{2})-(\d{2}).*', date_)
    if match:
        year = match.group(1)
        month = match.group(2)
        day = match.group(3)
        delta = now - datetime.date(int(year), int(month), int(day))
        print(delta)
当我等待编辑时

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

import datetime
import re

date_list = ['2019-02-10', '2018-01-13', '2019-02-8',]
now = datetime.date.today()

for date_ in date_list:
    match = re.match('.*(\d{4})-(\d{2})-(\d{2}).*', date_)
    if match:
        year = match.group(1)
        month = match.group(2)
        day = match.group(3)
        delta = now - datetime.date(int(year), int(month), int(day))

dates_range.append(int(delta.days))
days = min(s for s in dates_range)

将每个字符串转换为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)]

将每个字符串转换为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)]
使用内置的 Python的内置模块具有满足您需求的功能

首先,让我们将日期列表转换为datetime对象列表:

从日期时间导入日期时间
日期列表=['2019-02-10'、'2018-01-13'、'2019-02-8']
datetime_列表=[datetime.strTime(日期,“%Y-%m-%d”)表示日期列表中的日期]
一旦我们有了这个,我们就可以发现这些日期和今天的日期之间的差异

today=datetime.today()
日期差异=[日期时间列表中日期的abs(日期-今天)]
非常好,
date\u diff
现在是
datetime.timedelta
对象的列表。剩下的就是找到最小值和它代表的日期

要找到最小差异,使用
min(date\u diff)
非常简单,但是,我们希望使用该最小值来提取相应的最近日期。这可以通过以下方式实现:

最近日期=日期列表[日期差异索引(最小值(日期差异))] 和熊猫在一起 如果性能是一个问题,那么可能值得研究一个实现。使用pandas,我们可以将您的日期转换为pandas数据框:

从日期时间导入日期时间
作为pd进口熊猫
日期列表=['2019-02-10'、'2018-01-13'、'2019-02-8']
date_df=pd.to_datetime(日期列表)
最后,与使用内置工具的方法一样,我们找到日期的差异,并使用它提取最接近今天的日期

today=datetime.today()
日期差=绝对值(今天-日期差)
最近的日期=日期列表[日期差异.argmin()]
这种方法的优点是我们删除了for循环,因此我希望这种方法对于使用内置的大量日期更有效 Python的内置模块具有满足您需求的功能

首先,让我们将日期列表转换为datetime对象列表:

从日期时间导入日期时间
日期列表=['2019-02-10'、'2018-01-13'、'2019-02-8']
datetime_列表=[datetime.strTime(日期,“%Y-%m-%d”)表示日期列表中的日期]
一旦我们有了这个,我们就可以发现这些日期和今天的日期之间的差异

today=datetime.today()
日期差异=[日期时间列表中日期的abs(日期-今天)]
非常好,
date\u diff
现在是
datetime.timedelta
对象的列表。剩下的就是找到最小值和它代表的日期

要找到最小差异,使用
min(date\u diff)
非常简单,但是,我们希望使用该最小值来提取相应的最近日期。这可以通过以下方式实现:

最近日期=日期列表[日期差异索引(最小值(日期差异))] 和熊猫在一起 如果性能是一个问题,那么可能值得研究一个实现。使用pandas,我们可以将您的日期转换为pandas数据框:

从日期时间导入日期时间
作为pd进口熊猫
日期列表=['2019-02-10'、'2018-01-13'、'2019-02-8']
date_df=pd.to_datetime(日期列表)
最后,与使用内置工具的方法一样,我们找到日期的差异,并使用它提取最接近今天的日期

today=datetime.today()
日期差=绝对值(今天-日期差)
最近的日期=日期列表[日期差异.argmin()]

此方法的优点是,我们已删除for循环,因此我希望此方法对于大量日期更有效

此方法将字符串转换为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))]

它决不是最有效的,但它是半优雅的,并且可以工作。

这将字符串转换为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))]

它绝不是最有效的,但它是半优雅的,而且有效。

一种快速简单的方法是使用对分算法,尤其是当您的日期列表非常大时:

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))
导入日期时间
从对分导入左对分
FMT=“%Y-%m-%d”
日期列表=['2019-02-10'、'2018-01-13'、'2019-02-8'、'2019-02-12']
日期列表。排序()
def距离现在最近的天数(天):
"""
从有序的天数列表中返回最近的日期
"""
now=datetime.datetime.now()
左\u最近的\u天\u索引=对分\u左(天,现在.strftime(FMT))
#检查是否有一个更大的值
如果len(days)-1>左\u最近的\u day\u索引:
右最近日指数=左最近日指数+1
right\u day=datetime.datetime.StrTime(天[右最近的日期索引],FMT)
left_day=datetime.datetime.StrTime(天数[左侧最近的日期索引],FMT)
最近日指数=右最近日指数,如果abs(右日-现在)
一种快速简单的方法是使用对分算法,尤其是当您的日期列表非常大时:

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))
导入日期时间
从对分导入左对分
FMT=“%Y-%m-%d”
日期列表=['2019-02-10'、'2018-01-13'、'2019-02-8'、'2019-02-12']
日期列表。排序()
def距离现在最近的天数(天):
"""
Ret