5

如何使用 python 将小数年转换为实际日期?例如。我有一个包含小数年份的数组 [2012.343, 2012.444, 2012.509],我想得到“yyyy-mm-dd hh:mm”。

4

3 回答 3

8

这是一个更好的解决方案,它以日期时间格式为您提供答案。

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

此解决方案不计算闰年的额外天数。如果您需要这样做,请创建一个返回布尔值的函数 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

查看日期时间模块。您可以在那里为您的问题找到更好的解决方案。

于 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:将 Epoch 时间转换为日期时间

于 2013-10-10T21:02:04.080 回答