栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

获取最接近给定日期的日期

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

获取最接近给定日期的日期

>>> from datetime import timedelta, datetime>>> base_date = "10/29 06:58 AM">>> b_d = datetime.strptime(base_date, "%m/%d %I:%M %p")def func(x):    d =  datetime.strptime(x[0], "%m/%d %I:%M %p")    delta =  d - b_d if d > b_d else timedelta.max    return delta... >>> min(list_date, key = func)('10/30 02:17 PM', '+100', '-110')

datetime.strptime
将日期转换为datetime对象,所以
b_d
现在看起来像这样:

>>> b_ddatetime.datetime(1900, 10, 29, 6, 58)

现在我们可以编写一个函数,该函数可以传递给

key
参数
min

delta =  d - b_d if d > b_d else timedelta.max

如果,

d > b_d
即如果传递的日期
min
大于,
base_date
则将其差额
delta
分配
timedelta.max
给否则分配。

>>> timedelta.maxdatetime.timedelta(999999999, 86399, 999999)

更新:

>>> from datetime import timedelta, datetime>>> base_date = '10/29 06:59 AM'>>> b_d = datetime.strptime(base_date, "%m/%d %I:%M %p")>>> def func(x):...         d =  datetime.strptime(x[0], "%m/%d %I:%M %p")...         delta =  d - b_d if d > b_d else timedelta.max...         return delta... >>> lis2 = [('10/30 04:30 PM', '+1.5 -111', '-1.5 +101'), ('10/30 04:24 PM', '+1.5 -110', '-1.5     +100'), ('10/30 04:21 PM', '+1.5 -111', '-1.5 +101'), ('10/30 04:15 PM', '+1.5 -112', '-1.5 +102'), ('10/30 04:14 PM', '+1.5 -110', '-1.5 +100'), ('10/30 03:57 PM', '+1.5 -111', '-1.5 +101'), ('10/30 03:40 PM', '+1.5 -110', '-1.5 +100'), ('10/30 03:31 PM', '+1.5 -111', '-1.5 +101'), ('10/30 03:30 PM', '+1.5 -109', '-1.5 -101'), ('10/30 03:25 PM', '+1.5 -107', '-1.5 -103'), ('10/30 03:24 PM', '+1.5 -110', '-1.5 +100'), ('10/30 03:23 PM', '+1.5 -108', '-1.5 -102'), ('10/30 03:22 PM', '+1.5 -106', '-1.5 -104'), ('10/30 02:14 PM', '+1.5 -104', '-1.5 -106'), ('10/30 01:41 PM', '+1.5 -105', '-1.5 -105'), ('10/30 01:37 PM', '+1.5 -107', '-1.5 -103'), ('10/30 01:36 PM', '+1.5 -105', '-1.5 -105'), ('10/30 01:06 PM', '+1.5 -103', '-1.5 -107'), ('10/30 12:56 PM', '+2 -111', '-2 +101'), ('10/30 12:53 PM', '+2 -110', '-2 +100'), ('10/30 12:50 PM', '+2 -113', '-2 +103'), ('10/30 12:49 PM', '+2 -112', '-2 +102'), ('10/30 12:46 PM', '+2 -113', '-2 +103'), ('10/30 12:45 PM', '+2 -110', '-2 +100'), ('10/30 12:43 PM', '+2 -108', '-2 -102'), ('10/30 12:38 PM', '+2.5 -116', '-2.5 +106'), ('10/30 12:38 PM', '+2.5 -113', '-2.5 +103'), ('10/30 12:37 PM', '+2.5 -110', '-2.5 +100'), ('10/30 10:30 AM', '+2.5 -105', '-2.5 -105'), ('10/30 10:07 AM', '+3 -113', '-3 +103'), ('10/30 09:55 AM', '+3 -112', '-3 +102'), ('10/30 09:51 AM', '+3 -110', '-3 +100'), ('10/30 09:32 AM', '+3 -109', '-3 -101'), ('10/30 06:04 AM', '+3 -110', '-3 +100'), ('10/30 03:16 AM', '+3 -107', '-3 -103'), ('10/30 03:14 AM', '+3.5 -116', '-3.5 +106'), ('10/30 01:03 AM', '+3.5 -115', '-3.5 +105'), ('10/30 12:17 AM', '+3.5 -110', '-3.5 +100'), ('10/29 08:52 PM', '+3.5 -108', '-3.5 -102'), ('10/29 01:31 PM', '+3.5 -105', '-3.5 -105'), ('10/29 06:48 AM', '+3.5 -110', '-3.5 +100'), ('10/29 06:47 AM', '+3.5 -109', '-3.5 -101'), ('10/29 05:39 AM', '+3.5 -113', '-3.5 +103'), ('10/29 03:34 AM', '+3.5 -108', '-3.5 -102'), ('10/29 12:44 AM', '+3.5 -110', '-3.5 +100'), ('10/29 12:41 AM', '+3.5 -107', '-3.5 -103'), ('10/29 12:40 AM', '+3.5 -105', '-3.5 -105'), ('10/28 12:52 PM', '+4 -105', '-4 -105')]>>> min(lis2, key = func)('10/29 01:31 PM', '+3.5 -105', '-3.5 -105')

时序比较:

脚本:

from datetime import datetime, timedeltaimport sysimport timelist_date = [('10/30 04:30 PM', '+1.5 -111', '-1.5 +101'), ('10/30 04:24 PM', '+1.5 -110', '-1.5     +100'), ('10/30 04:21 PM', '+1.5 -111', '-1.5 +101'), ('10/30 04:15 PM', '+1.5 -112', '-1.5 +102'), ('10/30 04:14 PM', '+1.5 -110', '-1.5 +100'), ('10/30 03:57 PM', '+1.5 -111', '-1.5 +101'), ('10/30 03:40 PM', '+1.5 -110', '-1.5 +100'), ('10/30 03:31 PM', '+1.5 -111', '-1.5 +101'), ('10/30 03:30 PM', '+1.5 -109', '-1.5 -101'), ('10/30 03:25 PM', '+1.5 -107', '-1.5 -103'), ('10/30 03:24 PM', '+1.5 -110', '-1.5 +100'), ('10/30 03:23 PM', '+1.5 -108', '-1.5 -102'), ('10/30 03:22 PM', '+1.5 -106', '-1.5 -104'), ('10/30 02:14 PM', '+1.5 -104', '-1.5 -106'), ('10/30 01:41 PM', '+1.5 -105', '-1.5 -105'), ('10/30 01:37 PM', '+1.5 -107', '-1.5 -103'), ('10/30 01:36 PM', '+1.5 -105', '-1.5 -105'), ('10/30 01:06 PM', '+1.5 -103', '-1.5 -107'), ('10/30 12:56 PM', '+2 -111', '-2 +101'), ('10/30 12:53 PM', '+2 -110', '-2 +100'), ('10/30 12:50 PM', '+2 -113', '-2 +103'), ('10/30 12:49 PM', '+2 -112', '-2 +102'), ('10/30 12:46 PM', '+2 -113', '-2 +103'), ('10/30 12:45 PM', '+2 -110', '-2 +100'), ('10/30 12:43 PM', '+2 -108', '-2 -102'), ('10/30 12:38 PM', '+2.5 -116', '-2.5 +106'), ('10/30 12:38 PM', '+2.5 -113', '-2.5 +103'), ('10/30 12:37 PM', '+2.5 -110', '-2.5 +100'), ('10/30 10:30 AM', '+2.5 -105', '-2.5 -105'), ('10/30 10:07 AM', '+3 -113', '-3 +103'), ('10/30 09:55 AM', '+3 -112', '-3 +102'), ('10/30 09:51 AM', '+3 -110', '-3 +100'), ('10/30 09:32 AM', '+3 -109', '-3 -101'), ('10/30 06:04 AM', '+3 -110', '-3 +100'), ('10/30 03:16 AM', '+3 -107', '-3 -103'), ('10/30 03:14 AM', '+3.5 -116', '-3.5 +106'), ('10/30 01:03 AM', '+3.5 -115', '-3.5 +105'), ('10/30 12:17 AM', '+3.5 -110', '-3.5 +100'), ('10/29 08:52 PM', '+3.5 -108', '-3.5 -102'), ('10/29 01:31 PM', '+3.5 -105', '-3.5 -105'), ('10/29 06:48 AM', '+3.5 -110', '-3.5 +100'), ('10/29 06:47 AM', '+3.5 -109', '-3.5 -101'), ('10/29 05:39 AM', '+3.5 -113', '-3.5 +103'), ('10/29 03:34 AM', '+3.5 -108', '-3.5 -102'), ('10/29 12:44 AM', '+3.5 -110', '-3.5 +100'), ('10/29 12:41 AM', '+3.5 -107', '-3.5 -103'), ('10/29 12:40 AM', '+3.5 -105', '-3.5 -105'), ('10/28 12:52 PM', '+4 -105', '-4 -105')]base_date = "10/29 06:58 AM"def func1(list_date):    #http://stackoverflow.com/a/17249420/846892    get_datetime = lambda s: datetime.strptime(s, "%m/%d %I:%M %p")    base = get_datetime(base_date)    later = filter(lambda d: get_datetime(d[0]) > base, list_date)    return min(later, key = lambda d: get_datetime(d[0]))def func2(list_date):    #http://stackoverflow.com/a/17249470/846892    b_d = datetime.strptime(base_date, "%m/%d %I:%M %p")    def func(x):       d =  datetime.strptime(x[0], "%m/%d %I:%M %p")       delta =  d - b_d if d > b_d else timedelta.max       return delta    return min(list_date, key = func)def func3(list_date):    #http://stackoverflow.com/a/17249529/846892    fmt = '%m/%d %I:%M %p'    d = datetime.strptime(base_date, fmt)    def foo(x):        return (datetime.strptime(x[0],fmt)-d).total_seconds() > 0    return sorted(list_date, key=foo)[-1]def func4(list_date):    #http://stackoverflow.com/a/17249441/846892    fmt = '%m/%d %I:%M %p'    base_d = datetime.strptime(base_date, fmt)    candidates = ((datetime.strptime(d, fmt), d, x, y) for d, x, y in list_date)    candidates = min((dt, d, x, y) for dt, d, x, y in candidates if dt > base_d)    return  candidates[1:]

结果:

>>> from so import *#check output irst>>> func1(list_date)('10/29 01:31 PM', '+3.5 -105', '-3.5 -105')>>> func2(list_date)('10/29 01:31 PM', '+3.5 -105', '-3.5 -105')>>> func3(list_date)('10/29 01:31 PM', '+3.5 -105', '-3.5 -105')>>> func4(list_date)('10/29 01:31 PM', '+3.5 -105', '-3.5 -105')>>> %timeit func1(list_date)100 loops, best of 3: 3.07 ms per loop>>> %timeit func2(list_date)100 loops, best of 3: 1.59 ms per loop      #winner>>> %timeit func3(list_date)100 loops, best of 3: 1.91 ms per loop>>> %timeit func4(list_date)1000 loops, best of 3: 2.02 ms per loop#increase the input size>>> list_date = list_date *10**3>>> len(list_date)48000>>> %timeit func1(list_date)1 loops, best of 3: 3.6 s per loop>>> %timeit func2(list_date) #winner1 loops, best of 3: 1.99 s per loop      >>> %timeit func3(list_date)1 loops, best of 3: 2.09 s per loop>>> %timeit func4(list_date)1 loops, best of 3: 2.02 s per loop#increase the input size again>>> list_date = list_date *10>>> len(list_date)480000>>> %timeit func1(list_date)1 loops, best of 3: 36.4 s per loop>>> %timeit func2(list_date)       #winner1 loops, best of 3: 20.2 s per loop>>> %timeit func3(list_date)1 loops, best of 3: 22.8 s per loop>>> %timeit func4(list_date)1 loops, best of 3: 22.7 s per loop


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/639179.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号