python中迄今为止给出道琼斯指数的最大可能年份的字符串

2024-05-13 20:01:50 发布

您现在位置:Python中文网/ 问答频道 /正文

给出:

from datetime import datetime

date = datetime.strptime('Wed 12 Nov', '%a %d %b')

它返回datetime.datetime(1900, 11, 12, 0, 0)。在过去的一年里,什么可能是获得最好成绩的最好方法?在这种情况下,应该是2014年而不是1900年。你知道吗

任何帮助都将不胜感激。你知道吗


Tags: 方法fromimportdatetimedate情况nov成绩
1条回答
网友
1楼 · 发布于 2024-05-13 20:01:50

您可以从datetime.now()中得到年份并减去1:

from datetime import datetime

date = datetime.strptime('Wed 12 Nov {}'.format(datetime.now().year-1), '%a %d %b %Y')

这在2月29日不起作用。你知道吗

实际上,第一个实现中的一个bug是从星期一开始的,因为1900年11月12日是星期一:

dte = 'Wed 12 Nov'

start = datetime.strptime('Wed 12 Nov', "%a %d %b")
greatest = None

while start <= datetime.now():
    start += timedelta(days=1)
    if start.strftime("%a %d %b") == dte:
        greatest = start

print(greatest)

2014-11-12 00:00:00

还有一个monthdelta包,您可以使用它按月递增:

from datetime import datetime
from monthdelta import monthdelta


dte = 'Wed 12 Nov'

start = datetime.strptime('Wed 12 Nov', "%a %d %b")
greatest = None

while start <= datetime.now():
    start += monthdelta(1)
    if start.strftime("%a %d %b") == dte:
        greatest = start

print(greatest)

您可以看到,按月递增要高效得多:

In [1]: from datetime import datetime, timedelta

In [2]: %%timeit
   ...: dte = 'Wed 12 Nov'
   ...: start = datetime.strptime('Wed 12 Nov', "%a %d %b")
   ...: greatest = None
   ...: while start <= datetime.now():
   ...:     start += timedelta(days=1)
   ...:     if start.strftime("%a %d %b") == dte:
   ...:         greatest = start
   ...: 
1 loops, best of 3: 382 ms per loop

In [3]: from datetime import datetime

In [4]: from monthdelta import monthdelta

In [5]: %%timeit
   ...: dte = 'Wed 12 Nov'
   ...: start = datetime.strptime('Wed 12 Nov', "%a %d %b")
   ...: greatest = None
   ...: while start <= datetime.now():
   ...:     start += monthdelta(1)
   ...:     if start.strftime("%a %d %b") == dte:
   ...:         greatest = start
   ...: 
100 loops, best of 3: 18.7 ms per loop

这两种方法都返回得很快,但是如果您有许多方法调用,那么每月增加一次是更好的选择。 我们也可以增加30天,然后设置为12天,可能会有错误,因为我没有过度测试它:

def match_date(abb_wk_dy, day_date, abb_mon):
    dte = "{} {} {}".format(abb_wk_dy.capitalize(), day_date, abb_mon.capitalize())
    start = datetime.strptime(dte, "%a %d %b")
    greatest = None
    while start <= datetime.now():
        start +=  timedelta(days=30)
        start = start.strptime("{} {} {}".format(start.year, start.month, day_date), "%Y %m %d")
        if start.strftime("%a %d %b") == dte:
            greatest = start
    return greatest

最后一段代码运行效率很高:

In [12]: timeit match_date("wed","12","nov")
10 loops, best of 3: 34.7 ms per loop

如果您只想要年份,那么返回greatest.year。你知道吗

在测试上述代码时,闰年会失败,因此我们需要抓住这一点,我们也可以每次将年份增加1:

def match_date(abb_wk_dy, day_date, abb_mon):
    wkd, dd, ab = abb_wk_dy.capitalize(), day_date, abb_mon.capitalize()
    match = "{} {} {}".format(wkd, dd, ab)
    try:
        dte = "{} {} {} {}".format(1900, wkd, dd, ab)
        start = datetime.strptime(dte, "%Y %a %d %b")
    except ValueError:
        # first leap year since 1900
        dte = "{} {} {} {}".format(1904, wkd, dd, ab)
        start = datetime.strptime(dte, "%Y %a %d %b")
    day, mon = start.day, start.month
    greatest = None
    while start <= datetime.now():
        try:
            start = start.strptime("{} {} {}".format(start.year + 1, mon, day), "%Y %m %d")
        except ValueError:
            start = start.strptime("{} {} {}".format(start.year + 1, 01, 01), "%Y %m %d")
            continue
        if start.strftime("%a %d %b") == match:
            greatest = start
    return greatest.year if greatest else "No match"

运行于:

In [27]: timeit match_date("Wed","12","Nov")
100 loops, best of 3: 2.63 ms per loop

您还需要验证是否从未输入任何天>;31,以及其他月份和日期是否匹配,这可以使用dict或calender.monthrange或dict mapping max day in month to month name实现。你知道吗

相关问题 更多 >