python中迄今为止的字符串,其中包含给出道琼斯指数时可能出现的最大年份

python中迄今为止的字符串,其中包含给出道琼斯指数时可能出现的最大年份,python,datetime,Python,Datetime,鉴于: 它返回datetime.datetime(1900,11,12,0,0)。什么可能是获得过去一年最好成绩的最佳方式?在这种情况下,应该是2014年,而不是1900年 任何帮助都将不胜感激。您可以从datetime.now()中获取年份,然后减去1: from datetime import datetime date = datetime.strptime('Wed 12 Nov', '%a %d %b') 这在2月29日是行不通的 实际上,第一个实现中的一个bug是在星期一开始的,

鉴于:

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


任何帮助都将不胜感激。

您可以从
datetime.now()中获取年份,然后减去1:

from datetime import datetime

date = datetime.strptime('Wed 12 Nov', '%a %d %b')
这在2月29日是行不通的

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

from datetime import datetime

date = datetime.strptime('Wed 12 Nov {}'.format(datetime.now().year-1), '%a %d %b %Y')
如果您只想要年份,则返回
最大.year

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

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

您还需要验证是否没有输入日期>31,其他月份和日期是否匹配,这可以使用dict或
日历来实现。monthrange
或dict映射月到月名称中的最大日期。

如果(输入月,输入日)在(今天月,今天日)-但是如果(输入月,输入日)今年已经发生了,他们想(今天是今年)--但我肯定读了比写的更多的问题。@jedwards,我的想法是一样的,但并不完全清楚,一个简单的检查当前日期和月份是否为>,然后使用当前年份应该有效如果是这样的话如果你有
“11月12日星期二”
,它不会起作用,因为预期的年份是2013年。关键是在一周中的某一天,这很公平。编辑:哇,这是一个完全不同的问题,看到那个评论。@Chesstrian,我将添加编辑。如果本年度的日期已经过去,你认为今年是最伟大的一年吗?另外,它落下的确切日期使它变得不同,但实际上很容易做到
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
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
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