python как преобразовать даты дат в десятичные годы

Я ищу способ конвертировать объекты datetime в десятичный год. Ниже приведен пример

>>> obj = SomeObjet() >>> obj.DATE_OBS datetime.datetime(2007, 4, 14, 11, 42, 50) 

Как преобразовать datetime.datetime (2007, 4, 14, 11, 42, 50) в десятичные годы? Из этого формата dd / mm / yyyy в этот вид формата yyyy.yyyy

 from datetime import datetime as dt import time def toYearFraction(date): def sinceEpoch(date): # returns seconds since epoch return time.mktime(date.timetuple()) s = sinceEpoch year = date.year startOfThisYear = dt(year=year, month=1, day=1) startOfNextYear = dt(year=year+1, month=1, day=1) yearElapsed = s(date) - s(startOfThisYear) yearDuration = s(startOfNextYear) - s(startOfThisYear) fraction = yearElapsed/yearDuration return date.year + fraction 

Демо-версия:

 >>> toYearFraction(dt.today()) 2011.47447514 

Этот метод, вероятно, является точным с точностью до второго (или часа, когда действуют дневные сбережения или другие странные региональные вещи). Он также работает правильно во время прыжков. Если вам требуется решительное разрешение (например, из-за изменений в вращении Земли), вам лучше обратиться к сетевому сервису.

Я предполагаю, что вы используете это для сравнения значений datetime. Для этого, пожалуйста, используйте объекты timedelta вместо того, чтобы переустанавливать колесо.

Пример:

 >>> from datetime import timedelta >>> from datetime import datetime as dt >>> d = dt.now() >>> year = timedelta(days=365) >>> tomorrow = d + timedelta(days=1) >>> tomorrow + year > d + year True 

Если по какой-то причине вам действительно нужны десятичные годы, объекты datetime object strftime() могут дать вам целочисленное представление дня года, если задано значение %j – если это то, что вы ищете, см. Ниже простой пример (только при разрешении 1 день):

 >>> from datetime import datetime >>> d = datetime(2007, 4, 14, 11, 42, 50) >>> (float(d.strftime("%j"))-1) / 366 + float(d.strftime("%Y")) 2007.2814207650274 

Это немного проще, чем другие решения:

 import datetime def year_fraction(date): start = datetime.date(date.year, 1, 1).toordinal() year_length = datetime.date(date.year+1, 1, 1).toordinal() - start return date.year + float(date.toordinal() - start) / year_length >>> print year_fraction(datetime.datetime.today()) 2016.32513661 

Обратите внимание, что это вычисляет долю в зависимости от начала дня, так что 31 декабря будет 0.997, а не 1.0.

Удивленный никто не упомянул об этом … но объекты datetime.timedelta которые являются результатом вычитания объектов datetime.datetime имеют метод разделения. Таким образом, вы можете использовать простую функцию

 from datetime import datetime def datetime2year(dt): year_part = dt - datetime(year=dt.year, month=1, day=1) year_length = datetime(year=dt.year+1, month=1, day=1) - datetime(year=dt.year, month=1, day=1) return dt.year + year_part/year_length 

где разделение между объектами datetime.timedelta .