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