2012-04-26 33 views
9

Tôi đang cố thực hiện một số phép tính vào ngày, tôi có đối tượng timedelta và tôi muốn lấy số giây. Có vẻ như dt.total_seconds() thực hiện chính xác những gì tôi cần nhưng tiếc là nó đã được giới thiệu trong Python 2.7 và tôi bị mắc kẹt với một phiên bản cũ hơn.Tính toán tổng số phần nghìn giây bằng Python cho mô đun datetime có phân chia thực được kích hoạt

Nếu tôi đọc the official documentation, nó khẳng định như sau:

Return tổng số giây chứa trong thời gian. Tương đương với (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 ** 6)/10 ** 6 được tính với phân chia thực sự được bật.

Và sau khi xem xét nguồn gốc của datetime mô-đun (trong C), tôi thấy một cái gì đó như thế này:

total_seconds = PyNumber_TrueDivide(total_microseconds, one_million); 

Vì vậy, trong khi các tính toán của total_seconds() có vẻ tầm thường, rằng lá tôi tự hỏi điều này phân chia thực sự thực sự có nghĩa là. Tôi không thể tìm thấy bất kỳ thông tin nào về chủ đề này. Điều gì sẽ xảy ra nếu tôi chỉ sử dụng phân chia thường xuyên, tại sao chúng ta cần bộ phận thực sự này và nó làm gì? Tôi có thể viết total_seconds() bằng Python với số lượng tương đương đã cho trong tài liệu không?

+2

+1 Câu hỏi hay! Các tài liệu có lẽ nên rõ ràng hơn vào thời điểm này. – katrielalex

+0

-1 Câu hỏi không hợp lệ. "Tôi không thể tìm thấy bất kỳ thông tin về chủ đề" là BS. google ("python true division") –

+0

@JohnMachin Điều này không thay đổi thực tế là doc không rõ ràng về chủ đề này. Cảm ơn bạn đã bình luận xây dựng của bạn. –

Trả lời

10

Với bộ phận thực sự, 1/2 sẽ dẫn đến 0.5. Hành vi mặc định trong Python 2.x là sử dụng phân chia số nguyên, trong đó 1/2 sẽ dẫn đến 0. Dưới đây là giải thích từ số docs:

Phân chia số nguyên đồng bằng hoặc dài mang lại một số nguyên cùng loại; kết quả là phân chia toán học với hàm 'sàn' được áp dụng cho kết quả.

Để kích hoạt bộ phận thực thụ trên Python 2.2 hoặc cao hơn (không cần thiết trên Python 3.x), bạn có thể sử dụng như sau:

from __future__ import division 

Ngoài ra, bạn chỉ có thể làm cho một trong các đối số một phao để có được cùng một hành vi:

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6)/10.0**6 
+0

Giải thích rõ ràng và súc tích, cảm ơn! –

0

Cách dễ nhất để thực hiện việc này, khi bạn sử dụng số trong mã là sử dụng phao trên phân chia thứ nhất.

Nếu bạn sử dụng 10,0 ** 6, kết quả của bạn sẽ là một phao, có nghĩa là tất cả các số khác trong công thức sẽ nổi, dẫn đến "phân chia thực".

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