2015-08-05 17 views
9

Tôi đã từng chơi một chút để cố gắng hiểu được dấu thời gian và dấu thời gian của gấu trúc. Tôi thích cách bạn có thể hoạt động với họ, nhưng khi cố gắng trừ Tôi thấy điều này hơi lạ:Trừ dấu thời gian của gấu trúc; giá trị tuyệt đối

now = pd.Timestamp('now') 
then = now - pd.to_timedelta('1h') 

print (now - then) 
print (then - now) 
print ((now - then).seconds) 
print ((then - now).seconds) 

Kết quả trong:

0 days 01:00:00 
-1 days +23:00:00 
3600 
82800 

a) Làm thế nào tôi nên hiểu hành vi này?

b) Có cách nào để có giá trị tuyệt đối về sự khác biệt của dấu thời gian, tương đương với abs() không?

Trả lời

9

Lý do cho hành vi có vẻ lạ/buggy này là .seconds thuộc tính của một timedelta (ví pandas.Timedelta, nhưng điều này được thừa hưởng từ tiêu chuẩn thư viện của timedelta.timedelta) là rất ambigous.
Timedelta được lưu trữ trong 3 phần: ngày, giây, micro giây (https://docs.python.org/2/library/datetime.html#timedelta-objects). Vì vậy, seconds là tổng số giờ, phút và giây (tính bằng giây).

Vì vậy, có 2 điều 'kỳ lạ' có thể dẫn đến sự nhầm lẫn:

  • Khi có một timedelta tiêu cực, bạn sẽ có được -1 days +23:00:00 thay vì -01:00:00. Điều này là do chỉ có phần days có thể âm. Vì vậy, một timedelta âm sẽ luôn được xác định là số ngày âm với số giờ thêm hoặc giây để lấy giá trị chính xác. Vì vậy, điều này cung cấp cho bạn phần +23h.
  • Số giây là tổng số giờ, phút và giây. Vì vậy, +23:00:00 chúng tôi nhận được bằng 82800 giây.

Dòng dưới cùng, thuộc tính .seconds của một timedelta không cung cấp cho bạn phần giây không phải là tổng số giây (timedelta được chuyển đổi thành giây). Vì vậy, trong thực tế, tôi nghĩ bạn hầu như không bao giờ nên sử dụng nó.

Để có được timedelta tính bằng giây, bạn có thể sử dụng phương thức total_seconds. Nếu tôi xác định sự khác biệt tiêu cực cho diff = then - now:

In [12]: diff 
Out[12]: Timedelta('-1 days +23:00:00') 

In [13]: diff.seconds 
Out[13]: 82800 

In [14]: diff.total_seconds() 
Out[14]: -3600.0 
+0

Cảm ơn bạn rất nhiều. Mặc dù nó là rõ ràng từ câu trả lời của bạn, tôi sẽ để lại cho rõ ràng, để tìm giá trị tuyệt đối của một phép trừ của dấu thời gian: abs ((ts1-ts2) .total_seconds) – luna1999

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