4


1

'Jan-2010’と 'Mar-2010’の2つの文字列があり、それが2つのdatetimeオブジェクトを返すようにそれを解析したいとしましょう:2010年1月1日と2010年3月31日。 最終日)。

Pythonで最善の戦略は何でしょうか。 私は単に文字列をトークンに分割するか、または正規表現を使用してから 'Mar-2010’の月の最終日を言うためにカレンダー関数を使用する必要があります(最初の日を取得するのは簡単です。月の最初の営業日)

助言がありますか? 前もって感謝します。

5 Answer


5


`strptime`はあなたに代わって文字列を日付に変換します:

def firstofmonth(MmmYyyy):return datetime.datetime.strptime(MmmYyyy、 '%b-%Y')。date()

トークナイズ、regexpをいじってみるよりはるかに良い、

月の最後の日の日付を取得するには、本当にcalendarモジュールを使うことができます。

def lastofmonth(MmmYyyy):first = firstofmonth(MmmYyyy)_、lastday = calendar.monthrange(first.year、first.month)を返す

例えば、ALMOSTの作業方法のように、datetimeだけできちんとそれを行うことができます。

def lastofmonth(MmmYyyy):first = firstofmonth(MmmYyyy)はfirst.replaceを返します(月= first.month 1、日= 1) -  datetime.timedelta(days = 1)

しかし残念ながら、これは12月になります、そして12月を特別なケースにするのに必要とされるコードは全体的なアプローチをカレンダーが手に入れるよりも楽にします;-)


3


ここでダウンロードして読むことができるpython timeseriesモジュールの使用を強くお勧めします。

日付文字列を解析するには、dateutilパッケージも使用する必要があります。これは、次の場所にあります。

それからあなたはこのようなことをすることができます

import datetime import dateutil.parserインポートscikits.timeseries TSとしてm1 = TS.Date( 'M'、datetime = dateutil.parser.parse( 'Jan-2010'))m2 = TS.Date( 'M'、datetime = dateutil .parser.parse( 'Mar-2010'))d1 = m1.asfreq( 'D'、relation = 'START')#はTSを返します。dateオブジェクトd2 = m2.asfreq( 'D'、relation = 'END' )

firstDay = d1.datetime lastDay = d2.datetime

この解決策は外部のモジュールに依存していますが、非常に強力でよく書かれています。


2


日時からインポート日時、timedelta

def first_day(some_date):some_date.replaceを返します(日= 1、時= 0、分= 0、秒= 0、マイクロ秒= 0)

def next_month(some_date):first_dayを返す(first_day(some_date)timedelta(days = 31))

def last_day(some_date):next_month(some_date)を返す -  timedelta(days = 1)

#テスト:

months = [( 'Jan-2010'、 'Mar-2010')、#あなたの例( 'Apr-2009'、 'Apr-2009')、#同じ月、30日( 'Jan-2008'、 'Dec- 2008 ')、#通年(' Jan-2007 '、' Feb-2007 ')]#2月が関与

date1、date2(月):print first_day(datetime.strptime(date1、 '%b-%Y'))、print ' - '、print last_day(datetime.strptime(date2、 '%b-%Y'))

それは印刷されます:

2010-01-01 00:00:00  -  2010-03-31 00:00:00 2009-04-01 00:00:00  -  2009-04-30 00:00:00 2008-01-01 00:00 :00  -  2008-12-31 00:00:00 2007-01-01 00:00:00  -  2007-02-28 00:00:00


1


私はそれが長い間過ぎ去ったことを知っている、しかし誰かが必要とするならば:

dateutilインポートルールからdateutilインポートパーサーfrom datetimeインポートdatetime

first_day = parser.parse( 'Jan-2010'、デフォルト= datetime(1,1,1))last_day = rrule.rrule(rrule.MONTHLY、カウント= 1、bymonthday = -1、bysetpos = 1、dtstart =パーサー解析( '2010年3月'))


0


アレックスMartelliのをリフ:

import datetime def lastofmonthHelper(MmmYyyy):#日付の戻り値を取得します= 1)

>>>範囲内の月(1,13)の場合:
...     t = datetime.date(2009,month,1)
...     print t, lastofmonthHelper(t)
...
2009-01-01 2009-01-31 2009-02-01 2009-02-28 2009-03-01 2009-03-31 2009-04-01 2009-04-30 2009-05-01 2009-05-31 2009-06-01 2009-06-30 2009-07-01 2009-07-31 2009-08-01 2009-08-31 2009-09-01 2009-09-30 2009-10-01 2009-10-31 2009-11-01 2009-11-30 2009-12-01 2009-12-31

あなたは月の初日、BTWを使う必要はありません。 私はこれをコメントに入れていたでしょうが、フォーマットがどのようになったのかは私たち全員が知っています。 Alexに自由に投票してください。

firstofmonth()呼び出しの結果を使用して呼び出すと、目的の結果が得られます。

>>> lastofmonthHelper(firstofmonth( 'Apr-2009'))datetime.date(2009、4、30)