Uso secondi direttamente con relativedelta non popola i mesi ei campi anni e non v'è un motivo di Certo che non sapremmo se è un anno bisestile o un mese con 31 giorni.
Quindi qualcosa di simile:
[In]: tdelta = datetime.now() - datetime(1971, 1, 1)
[In]: relativedelta(seconds=tdelta.total_seconds())
[Out]: relativedelta(days=+16958, hours=+13, minutes=+19, seconds=+49)
dà delta relativa con un sacco di giorni e non mesi. Mentre in alcuni casi può andar bene, in alcuni potremmo aver bisogno di anni e mesi. Pertanto:
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)
Questa potrebbe non essere una soluzione molto pitonica ma funziona.
Nota: ciò presuppone che un anno abbia 365 giorni (ignora il salto di anni bisestili) e mesi di 30 giorni.
I microsecondi sono inclusi nel totale_secondi. –
@LennartRegebro: Sì, ma relativedelta non accetta i secondi frazionari ('relativedelta (seconds = 0.3)' fornisce 'relativedelta (seconds = + 0)'). Inoltre, come afferma la documentazione, i microsecondi potrebbero non essere accurati per intervalli molto grandi. –
relativedelta (secondi = 0,3) fornisce a relativedelta (secondi = 0,3). Sto usando python-dateutil 1.5 – falsetru