用于计算间隔的工具/库,例如“每月的最后一个星期四”

时间:2009-03-05 12:11:07

标签: python datetime date

我正在寻找一个命令行工具或某种python库(我可以将其包装),以便我可以计算指定日期,如“每月的最后一个星期四”。

即。我想让人们像上面那样输入人类友好的文本,它应该能够计算任何月份/年度的任何日期/任何满足该条件的日期。

有什么建议吗?

7 个答案:

答案 0 :(得分:7)

mxDateTime和Datejs以及该webservice都不支持“本月的最后一个星期四”。 OP想知道这个月的所有最后一个星期四,例如,整整一年。

mxDateTime支持这些操作,但问题必须在Python代码中提出,而不是字符串。

我能想到的最好的是parsedatetime,但这并不支持“本月的最后一个星期四”。它确实支持:

>>> c.parseDateText("last thursday of april 2001")
(2001, 4, 20, 13, 55, 58, 3, 64, 0)
>>> c.parseDateText("last thursday of may 2001")
(2001, 5, 20, 13, 56, 3, 3, 64, 0)
>>> c.parseDateText("last thursday of may 2010")
(2010, 5, 20, 13, 56, 7, 3, 64, 0)
>>> 

(请注意,DateJS和该Web服务都不支持此语法。)

编辑:嗯,好吧,但是虽然年份和月份都是正确的,但这一天却没有。 2001年4月的最后一个星期四是27日。我想你将不得不在这里推出自己的解决方案。

它不支持:

>>> c.parseDateText("last thursday of 2010")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "parsedatetime/parsedatetime.py", line 411, in parseDateText
    mth = self.ptc.MonthOffsets[mth]
KeyError
>>> 

所以一种可能性是文本替换:将字符串规范化为小写,单个空格等,然后对你感兴趣的每个月做一个字符串替换“月份”。你可能不得不调整任何一个找到的解决方案。例如,在他为在线音乐压延系统编写的一些old code of Skip Montanaro中:

     # someone keeps submitting dates with september spelled wrong...
     'septmber':9,

或者您在mxDateTime之上编写自己的解析器,使用上述所有链接作为参考。

答案 1 :(得分:3)

我认为你可以使用Python的标准calendar模块,甚至可以在这些方法之上添加一些“人性化”方法。该模块为您提供了日期的迭代器,同时考虑了几周,等等。

首先我猜你必须回答“什么是一些人性化的方式来讨论约会?”,我猜这个问题超过了这个问题的一半。

答案 2 :(得分:3)

算法并不难。它们在下面的书中提供,值得每一分钱。

http://emr.cs.iit.edu/home/reingold/calendar-book/third-edition/

一般方法是找到所需月份的第一天。然后,您可以减去一天以查找所需月份的最后一天。然后计算相对于您找到的星期几的所需日期的偏移量。

假设您有datetime.dat e,d。您可以通过计算下个月减去一天的开始来计算月末。

monIx= d.year*12 + (d.month-1) + 1
endOfMonth= datetime.date( monIx//12, monIx%12+1, 1 ) - datetime.timedelta( days=1 )

此时,您正在寻找一周中所需日期的偏移量。在这种情况下,所需的星期几是星期四,即3

dayOffset =  ((3 - endOfMonth.weekday()) -7 ) % -7 
lastDay = endOfMonth + datetime.timedelta( days=dayOffset )

获取星期偏移量的一般方法需要一点思考,但只有少数案例组合需要进行试验。

答案 3 :(得分:2)

我不完全确定,但您可以查看Python DateUtil模块。

答案 4 :(得分:1)

好吧,不知道这样的库是否存在,但GNU coreutils中的date有类似的东西:

$ date -d "last monday"
Mon Mar  2 00:00:00 RST 2009

答案 5 :(得分:1)

答案 6 :(得分:-1)

如果这是针对网络应用程序的,请查看Datejs,在表单中使用它可能更容易,然后将日期对象的值传递给Python。

如果你最终自己写一个,那么来源也可能会有所帮助。