2024-05-13 20:01:50 发布
网友
给出:
from datetime import datetime date = datetime.strptime('Wed 12 Nov', '%a %d %b')
它返回datetime.datetime(1900, 11, 12, 0, 0)。在过去的一年里,什么可能是获得最好成绩的最好方法?在这种情况下,应该是2014年而不是1900年。你知道吗
datetime.datetime(1900, 11, 12, 0, 0)
任何帮助都将不胜感激。你知道吗
您可以从datetime.now()中得到年份并减去1:
datetime.now()
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。你知道吗
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实现。你知道吗
calender.monthrange
您可以从
datetime.now()
中得到年份并减去1:这在2月29日不起作用。你知道吗
实际上,第一个实现中的一个bug是从星期一开始的,因为1900年11月12日是星期一:
还有一个monthdelta包,您可以使用它按月递增:
您可以看到,按月递增要高效得多:
这两种方法都返回得很快,但是如果您有许多方法调用,那么每月增加一次是更好的选择。 我们也可以增加30天,然后设置为12天,可能会有错误,因为我没有过度测试它:
最后一段代码运行效率很高:
如果您只想要年份,那么返回
greatest.year
。你知道吗在测试上述代码时,闰年会失败,因此我们需要抓住这一点,我们也可以每次将年份增加1:
运行于:
您还需要验证是否从未输入任何天>;31,以及其他月份和日期是否匹配,这可以使用dict或
calender.monthrange
或dict mapping max day in month to month name实现。你知道吗相关问题 更多 >
编程相关推荐