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