0

Pythonを使用して、day_of_a_year日のデルタ日とそれに対応する月、および月+1のデルタ日を計算したいと思います。

*申し訳ありませんが、年は既知の変数であることに言及するのを忘れました。

def a(day_of_year):
    <...>
    return [(days_from_start_of_month),(days_untill_end_of_month)]

だからもし

day_of_year = 32 
a(32) = (2,28) #assuming the month which the day_of_year corresponds to starts from day 30 and ends to day 60.

これまでのところ、datetime、timeutils、calendarモジュールを研究していますが、コードのロジックを理解することはできません。何かしっかりしたものがあればいいのにと思いますが、タイムデルタ関数のどこかで迷子になっています。

4

2 に答える 2

2

月の初日は、翌月の初日と同様に簡単に作成できます。それらを入手したら、残りはさらに簡単です。OPが指摘しているように、このcalendar.monthrange関数は、月の最後の日を取得するための最も読みやすい方法を提供します。

>>> from datetime import date, year
>>> import calendar
>>> def first_day(dt):
...      # Simply copy year and month into new date instance
...      return date(dt.year, dt.month, 1)
...
>>> def last_day(dt):
...      days_in_month = calendar.monthrange(dt.year, dt.month)[1]
...      return date(dt.year, dt.month, days_in_month)
...
>>> nth_day = 32
>>> day_of_year = date(2012, 1, 1) + timedelta(days=nth_day - 1)
>>> day_of_year
datetime.date(2012, 2, 1)
>>> first_day(day_of_year), last_day(day_of_year)
(datetime.date(2012, 2, 1), datetime.date(2012, 2, 29))
>>> day_of_year - first_day(day_of_year), last_day(day_of_year) - day_of_year
(datetime.timedelta(0), datetime.timedelta(28))

これらの手法を1つの機能に組み合わせるには:

def delta_to_start_and_end(year, day_of_year):
    dt = date(year, 1, 1) + timedelta(days=(day_of_year - 1))

    def first_day(dt):
         return date(dt.year, dt.month, 1)
    def last_day(dt):
         days_in_month = calendar.monthrange(dt.year, dt.month)[1]
         return date(dt.year, dt.month, days_in_month)

    return (dt - first_day(dt)).days, (last_day(dt) - dt).days

出力:

>>> delta_to_start_and_end(2012, 32)
(0, 28)
>>> delta_to_start_and_end(2011, 32)
(0, 27)
>>> delta_to_start_and_end(2012, 34)
(2, 26)
>>> delta_to_start_and_end(2012, 364)
(28, 2)

1これらの2つの値のそれぞれに追加するかどうかはわかりません。現在、月の最初の日(最初の例)は0最初の値として、(月の日数-1)は2番目の値として表示されます。これは、これらのポイントからの日数の差であるためです。これらが必要な場合+ 1は、関数の最後の行に2回追加するのは簡単です。delta_to_start_and_end

歴史的なメモとして、この回答の以前のバージョンでは、カレンダーモジュールなしで月の最後の日を計算するために別の方法を使用していました。

def last_day(dt):
     rest, month = divmod(dt.month, 12)
     return date(dt.year + rest, month + 1, 1) - timedelta(days=1) 

この関数は、divmod組み込み関数を使用して、「現在の月は12月」のエッジケースを処理します。その場合、翌月はそうではありません131、年も1つ増やす必要があります。数値を「開始」にロールバックすることは数値の絶対値ですが、divmod関数は除数も提供します。これは1、現在の月がである場合に発生します12。これにより、年をいつ増やすかを示す便利な指標が得られます。

于 2012-06-22T13:51:57.943 に答える
0

このために機能する既存のライブラリはないと思います。次のように、自分で何かを作成する必要があります。

monthdays = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)

day = 32

total = 0
for i in monthdays:
    if day - total - i < 0:
        before = day - total
        after = total + i - day
        break
    total += i

print before, after

(簡単なスタートですが、もっとエレガントな方法があるかもしれません)

于 2012-06-22T13:50:30.783 に答える