5

Python を使用して小数年を実際の日付に変換するにはどうすればよいですか? 例)小数年を含む配列 [2012.343, 2012.444, 2012.509] があり、「yyyy-mm-dd hh:mm」を取得したいと考えています。

4

3 に答える 3

8

ここでは、datetime 形式で回答を提供することをお勧めします。

from datetime import timedelta, datetime

def convert_partial_year(number):

    year = int(number)
    d = timedelta(days=(number - year)*365)
    day_one = datetime(year,1,1)
    date = d + day_one
    return date

このソリューションでは、うるう年の余分な日はカウントされません。そうする必要がある場合は、bool を返す関数 is_leap(year) を作成し、コードを次のように変更します。

from datetime import timedelta, datetime

def convert_partial_year(number):

    year = int(number)
    d = timedelta(days=(number - year)*(365 + is_leap(year)))
    day_one = datetime(year,1,1)
    date = d + day_one
    return date

datetime モジュールをチェックしてください。そこでは、問題に対するさらに優れた解決策を見つけることができます。

于 2013-10-10T20:59:14.837 に答える
3
import datetime as DT
def t2dt(atime):
    """
    Convert atime (a float) to DT.datetime
    This is the inverse of dt2t.
    assert dt2t(t2dt(atime)) == atime
    """
    year = int(atime)
    remainder = atime - year
    boy = DT.datetime(year, 1, 1)
    eoy = DT.datetime(year + 1, 1, 1)
    seconds = remainder * (eoy - boy).total_seconds()
    return boy + DT.timedelta(seconds=seconds)

def dt2t(adatetime):
    """
    Convert adatetime into a float. The integer part of the float should
    represent the year.
    Order should be preserved. If adate<bdate, then d2t(adate)<d2t(bdate)
    time distances should be preserved: If bdate-adate=ddate-cdate then
    dt2t(bdate)-dt2t(adate) = dt2t(ddate)-dt2t(cdate)
    """
    year = adatetime.year
    boy = DT.datetime(year, 1, 1)
    eoy = DT.datetime(year + 1, 1, 1)
    return year + ((adatetime - boy).total_seconds() / ((eoy - boy).total_seconds()))
于 2013-10-10T21:12:33.287 に答える
0

年の部分の 1 月 1 日のエポック時間を決定できます。それを小数部分の時間 365 * 24 * 60 * 60 に追加します。次に、エポック時間を日時に変換します。

Python: エポック時間を日時に変換するを参照してください。

于 2013-10-10T21:02:04.080 に答える