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

Có ai biết lý trí để chỉ cho phép phân thời gian chia hết cho các số nguyên không?Tại sao tôi không thể chia một datetime.timedelta bằng phao?

+2

FWIW, hoạt động tốt trong Py3K. – geoffspear

+0

@Woobie - Bạn chính xác. Tôi đã không thử điều đó ... – mgilson

Trả lời

5

Nó thực sự khá đơn giản - đó là một tính năng bị thiếu.

Điểm nổi bật của điều này là nó được thêm vào như một tính năng trong Python 3.x.

Lưu ý sự khác biệt giữa các bảng vận hành được hỗ trợ trong 2.x3.x.

+1

Cảm ơn. Tôi đã được chỉ sàn khi nó không hoạt động, và tôi đã tự hỏi nếu có bất kỳ hợp lý đằng sau nó. Kể từ khi nó hoạt động trong python 3.x, tôi sẽ giả sử bạn đúng và nó chỉ là một giám sát. Cảm ơn. – mgilson

+2

Vâng, hãy đặt nó xuống và thử lại! *cười thầm. – jpaugh

+0

3.2 và sau đó, không phải tất cả 3.x Chỉ cần một điểm thông tin ... –

2

Rất thú vị - Tôi đã có thể mong đợi rằng để làm việc quá. Tôi vừa viết một hàm với một số ví dụ/doctests thực hiện điều này trong Python 2.x. Cũng được đăng dưới dạng 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

Cần lưu ý rằng điều này khác với chức năng của Python 3.x, như tôi có thể nói, như Python 3.x '[Delta chia bởi một phao hoặc một int. Kết quả được làm tròn tới bội số gần nhất của timedelta.resolution bằng cách sử dụng nửa vòng tới thậm chí.] (Http://docs.python.org/py3k/library/datetime.html) 'và bạn không sử dụng độ phân giải, do đó, nó không hoàn toàn là một thay thế drop-in. Vẫn hữu ích, tuy nhiên, vì vậy +1. –

+0

Cuộc gọi công bằng - Tôi không cho rằng bạn có thể đề xuất chỉnh sửa để sửa lỗi này? (Giả sử nó đủ đơn giản - tôi nghĩ rằng điều này là đủ của một trường hợp cạnh mà nó có lẽ không quan trọng nhiều.) –

Các vấn đề liên quan