Использование секунд непосредственно relativedelta не заполняет месяцы и годы поля и есть причина Конечно, мы не знали бы, если это високосный год или месяц с 31 днем.
Так что-то вроде этого:
[In]: tdelta = datetime.now() - datetime(1971, 1, 1)
[In]: relativedelta(seconds=tdelta.total_seconds())
[Out]: relativedelta(days=+16958, hours=+13, minutes=+19, seconds=+49)
дает относительную дельту с большим количеством дней и не месяцев. Хотя в некоторых случаях это может быть хорошо, в некоторых из нас могут потребоваться годы и месяцы. Поэтому:
def timedelta_to_relativedelta(tdelta):
assert isinstance(tdelta, timedelta)
seconds_in = {
'year' : 365 * 24 * 60 * 60,
'month' : 30 * 24 * 60 * 60,
'day' : 24 * 60 * 60,
'hour' : 60 * 60,
'minute': 60
}
years, rem = divmod(tdelta.total_seconds(), seconds_in['year'])
months, rem = divmod(rem, seconds_in['month'])
days, rem = divmod(rem, seconds_in['day'])
hours, rem = divmod(rem, seconds_in['hour'])
minutes, rem = divmod(rem, seconds_in['minute'])
seconds = rem
return relativedelta(years=years, months=months, days=days, hours=hours, minutes=minutes, seconds=seconds)
Это может быть не очень Pythonic-решение, но оно работает.
Примечание: Предполагается, что год имеет 365 дней (игнорирует скачки без високосного года), а месяцы - 30 дней.
Микросекунды включены в итоговые_секунды. –
@ LennartRegebro: Да, но relativedelta не принимает дробные секунды ('relativedelta (seconds = 0.3)' дает 'relativedelta (seconds = + 0)'). Кроме того, как указывается в документации, микросекунды могут быть неточными в течение очень больших интервалов. –
relativedelta (секунды = 0,3) дает мне relativedelta (секунды = 0,3). Я использую python-dateutil 1.5 – falsetru