2012-05-17 13 views
6
>>> import datetime 
>>> now1 = datetime.datetime.now() 
>>> now2 = datetime.datetime.now() 
>>> timedelta = now2-now1 
>>> halfdt = timedelta/2 #This works just fine 
>>> halfdt = timedelta/2. #TypeError: unsupported operand type(s) for /: 'datetime.timedelta' and 'float' 

Qualcuno sa il razionale consentendo solo timedeltas di essere divisibile per interi?Perché non posso dividere un datetime.timedelta da un float?

+2

FWIW, funziona bene in Py3K. – geoffspear

+0

@Woobie - Sei corretto. Non l'avevo provato ... – mgilson

risposta

5

In realtà è abbastanza semplice - è stata una caratteristica mancante.

Il vantaggio di questo è che è stato aggiunto come una caratteristica in Python 3.x.

Annotare la differenza tra le tabelle operative supportate in 2.x e 3.x.

+1

Grazie. Ero appena finito quando non funzionava, e mi chiedevo se dietro ci fosse qualcosa di razionale. Dal momento che funziona in python 3.x, presumo che tu abbia ragione ed è stata solo una svista. Grazie. – mgilson

+2

Bene, provalo e riprova! * Risatina. – jpaugh

+0

3.2 e successive, non tutti 3.x Solo un punto di informazioni ... –

2

Molto interessante - mi sarei aspettato che lavorare troppo. Ho appena scritto una funzione con alcuni esempi/doctest che lo fanno in Python 2.x. Anche pubblicato come ActiveState recipe:

import datetime 

def divide_timedelta(td, divisor): 
    """Python 2.x timedelta doesn't support division by float, this function does. 

    >>> td = datetime.timedelta(10, 100, 1000) 
    >>> divide_timedelta(td, 2) == td/2 
    True 
    >>> divide_timedelta(td, 100) == td/100 
    True 
    >>> divide_timedelta(td, 0.5) 
    datetime.timedelta(20, 200, 2000) 
    >>> divide_timedelta(td, 0.3) 
    datetime.timedelta(33, 29133, 336667) 
    >>> divide_timedelta(td, 2.5) 
    datetime.timedelta(4, 40, 400) 
    >>> td/0.5 
    Traceback (most recent call last): 
     ... 
    TypeError: unsupported operand type(s) for /: 'datetime.timedelta' and 'float' 

    """ 
    # timedelta.total_seconds() is new in Python version 2.7, so don't use it 
    total_seconds = (td.microseconds + (td.seconds + td.days * 24 * 3600) * 1e6)/1e6 
    divided_seconds = total_seconds/float(divisor) 
    return datetime.timedelta(seconds=divided_seconds) 

if __name__ == '__main__': 
    import doctest 
    doctest.testmod() 
+0

Vale la pena notare che questo è diverso alle funzionalità di Python 3.x, per quanto posso dire, come Python 3.x fa '[Delta diviso da un float o un int. Il risultato viene arrotondato al più vicino multiplo di timedelta.resolution usando round-half-to-even.] (Http://docs.python.org/py3k/library/datetime.html)', e tuo non utilizza il risoluzione, quindi non è abbastanza una sostituzione drop-in. Ancora utile, tuttavia, quindi +1. –

+0

Fair call: non credo che potresti suggerire modifiche per risolvere il problema? (Supponendo che sia abbastanza semplice - penso che questo sia abbastanza di un caso limite che probabilmente non importa molto.) –

Problemi correlati