Python как конвертировать дату и время в десятичные годы - PullRequest
8 голосов
/ 23 июня 2011

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

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

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

Ответы [ 6 ]

24 голосов
/ 23 июня 2011
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

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

2 голосов
/ 23 июня 2011

Я предполагаю, что вы используете это для сравнения значений даты и времени. Для этого используйте объекты 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 объектный метод 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
1 голос
/ 28 февраля 2018

После реализации принятого решения у меня появилось откровение, что эта современная версия для панд идентична и намного проще:

dat['decimal_date']=dat.index.year+ (dat.index.dayofyear -1)/365

Должен использоваться на фрейме данных Pandas с индексом даты и времени. Добавление этого решения в начало моего поиска в Google по этому вопросу.

0 голосов
/ 30 января 2018

Можно рассчитать десятичную дату, используя юлианскую дату Панды и следующие формулы.

В случае, когда ваш информационный фрейм pandas имеет индекс даты-времени:

JD=dat.index.to_julian_date() #create julian date
L= JD+68569
N= 4*L/146097
L= L-(146097*N+3)/4
I= 4000*(L+1)/1461001
L= L-1461*I/4+31
J= 80*L/2447
K= L-2447*J/80
L= J/11
J= J+2-12*L
decimal_date= 100*(N-49)+I+L

decimal_date - это серия вашей даты (в том же TZ, что и индекс данных) в виде чего-то вроде 2007.123452.

Адаптировано из этого поста.

0 голосов
/ 23 февраля 2017

Удивило, что никто не упомянул об этом ... но у объектов 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 объектами.

0 голосов
/ 30 апреля 2016

Это немного более простой способ, чем другие решения:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...