2009-03-05 6 views
2

私はコマンドラインツールやPythonライブラリ(私はラップすることができます)を探していますので、指定した日付を計算できます"月の最後の木曜日"。「月の最後の木曜日」のような間隔を計算するためのツール/ライブラリ

つまり、私は人々が上記のような人間にやさしいテキストを入力させたいと思っています。それはそれを満たす月/年/日のすべての日付を計算できるはずです。

提案がありますか?そのようなライブラリが存在する場合

答えて

2

私は完全にはわかりませんが、Python DateUtilモジュールを見てください。

1

まあ、知らないが、GNUのcoreutilsのからdateはそのような何かがあります:私はいくつかを追加することによって、あなたはかなり遠く、多分、ちょうどPythonの標準calendarモジュールを使用して得ることができると思い

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

をそれらの方法の上に「人間にやさしい」方法を提供します。このモジュールは、イテレータに日付を与え、数週間を考慮しています。

まず、私はこの問題の半分以上の難しさを抱えていると思います。

-1

ウェブアプリケーションの場合は、Datejsをご覧ください。あなたのフォームでそれを使用して、日付オブジェクトの値をPythonに渡す方が簡単かもしれません。

あなたが自分で書いてしまうと、ソースも役に立ちます。

7

mxDateTimeもDatejsも、そのWebサービスでは「月の最後の水曜日」もサポートされていません。 OPは、例えば、1年間通算の最後の月曜日を知りたいと考えています。

mxDateTimeは操作をサポートしていますが、質問は文字列ではなくPythonコードで行う必要があります。

最高の数字はですが、「月の最後の木曜日」をサポートしていません。それはサポートしています:

>>> 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サービスのサポートこの構文ことに注意してください。)

EDIT:大丈夫、うーん、しかし、年と月が正しい一方で、一日のISN 't。 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の上に独自のパーサを書きます。

3

アルゴリズムは難しくありません。彼らは以下の本で提供されています。これはすべて1ペニーの価値があります。

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

一般的なアプローチは、必要な月の最初の日を見つけることです。その後、1日を引いて、必要な月の最終日を見つけることができます。次に、あなたが見つけた曜日を基準に、あなたが望む曜日のオフセットを計算します。

datetime.dat e、dとします。あなたは、翌月の開始日から1日を引いたものを計算することによって、月の終わりを見つけ出すことができます。

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) 

曜日のオフセットを得るための一般的なアプローチは、思考の少し必要ですが、使って実験する例ごく少数の組み合わせがあります。

関連する問題