2015-01-12 11 views
5

Desidero ottenere la durata totale di una relativedelta in termini di giorni.dateutil.relativedelta - Come ottenere la durata in giorni?

attesi:

dateutil.timedelta(1 month, 24 days) -> dateutil.timedelta(55 days) 

Quello che ho cercato:

dateutil.timedelta(1 month, 24 days).days -> 24 (WRONG) 

C'è un modo semplice per fare questo? Grazie!

+0

dateutil non avere '' relativedelta' né timedelta' almeno non la versione Im usando come tale non capisco la tua domanda 'datetime.timedelta' ha una proprietà' .days' ... –

+0

Sto usando questo https://labix.org/python-dateutil. '.days' restituirà solo il numero di giorni esclusi i mesi (vedi il mio esempio). –

+0

Sembra improbabile che si possa estrarre il tempo totale in giorni da un timedelta poiché diversi mesi e anni hanno un diverso numero di giorni. Vale a dire. il numero di giorni dipende dal mese e dall'anno relativi (informazioni non disponibili per timedelta). – Alex

risposta

5

Anche questo mi ha infastidito. Non c'è un modo molto pulito per ottenere l'intervallo di tempo in una particolare unità. Ciò è in parte dovuto alla dipendenza dall'intervallo di date delle unità.

relativedelta() accetta un argomento per mesi. Ma quando pensi a quanto è lungo un mese, la risposta è "dipende". Detto questo, è tecnicamente impossibile convertire un relativedelta() direttamente in giorni, senza sapere che giorni il delta atterra.

Ecco cosa ho fatto.

from datetime import datetime, timedelta 
from dateutil.relativedelta import relativedelta 

rd = relativedelta(years=3, months=7, days=19) 
# I use 'now', but you may want to adjust your start and end range to a specific set of dates. 
now = datetime.now() 

# calculate the date difference from the relativedelta span 
then = now - rd 
# unlike normal timedelta 'then' is returned as a datetime 
# subtracting two dates will give you a timedelta which contains the value you're looking for 
diff = now - then 

print diff.days 
0

Data semplice diff in realtà.

>>> from datetime import datetime 
    >>> (datetime(2017, 12, 1) - datetime(2018, 1, 1)).days 
    -31 

Per ottenere il numero di positivo è possibile scambiare date o utilizzare ABS:

>>> abs((datetime(2017, 12, 1) - datetime(2018, 1, 1)).days) 
    31