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