2012-05-17 18 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' 

¿Alguien sabe la razón por permitir que los timedeltas sean divisibles por números enteros?¿Por qué no puedo dividir un datetime.timedelta por un flotante?

+2

FWIW, funciona bien en Py3K. – geoffspear

+0

@Woobie - Estás en lo correcto. No lo había intentado ... – mgilson

Respuesta

5

En realidad es bastante simple: era una característica que faltaba.

La ventaja de esto es que se ha agregado como una característica en Python 3.x.

Tenga en cuenta la diferencia entre las tablas de operaciones admitidas en 2.x y 3.x.

+1

Gracias. Me quedé anonadado cuando no funcionó, y me preguntaba si había alguna razón detrás de esto. Como funciona en python 3.x, asumiré que tienes razón y fue solo un descuido. Gracias. – mgilson

+2

¡Bien, pégalo y vuelve a intentarlo! *risita. – jpaugh

+0

3.2 y posterior, no todos 3.x Solo un punto de información ... –

2

Muy interesante - Yo esperaba que eso también funcionara. Acabo de escribir una función con algunos ejemplos/doctests que hace esto en Python 2.x. También publicado como 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 señalar que esto es diferente a la funcionalidad de Python 3.x, por lo que puedo decir, ya que Python 3.x lo hace '[Delta dividido por un flotador o un int. El resultado se redondea al múltiplo de timedelta.resolution más cercano usando round-half-to-even.] (Http://docs.python.org/py3k/library/datetime.html) ', y el suyo no usa el resolución, por lo que no es un reemplazo directo. Todavía útil, sin embargo, así que +1. –

+0

Llamada justa: supongo que no podría sugerir modificaciones para solucionar esto. (Suponiendo que sea lo suficientemente simple, creo que esto es suficiente como un argumento de que probablemente no importe mucho). –

Cuestiones relacionadas